我已经在带有Elasticsearch-Spark连接器的火花壳中进行了一些实验。调用火花:
] $SPARK_HOME/bin/spark-shell --master local[2] --jars ~/spark/jars/elasticsearch-spark-20_2.11-5.1.2.jar
在scala shell中:
scala> import org.elasticsearch.spark._ scala> val es_rdd = sc.esRDD("myindex/mytype",query="myquery")
它运作良好,结果包含myquery中指定的良好记录。唯一的事情是,即使我在查询中指定了这些字段的子集,我也获得了所有字段。例:
myquery = """{"query":..., "fields":["a","b"], "size":10}"""
返回所有字段,不仅返回a和b(顺便说一句,我注意到大小参数都不考虑在内:result包含10条以上的记录)。也许添加字段是嵌套的很重要,a和b实际上是doc.a和doc.b。
这是连接器中的错误还是语法错误?
使用spark elasticsearch连接器,fields因此无法应用投影。
fields
如果希望对映射使用细粒度的控制,则应该DataFrame改用基本上是RDD和模式的映射。
DataFrame
pushdown 还应启用谓词,以将Spark SQL转换(下推)为Elasticsearch Query DSL。
pushdown
现在是一个半完整的示例:
myQuery = """{"query":..., """ val df = spark.read.format("org.elasticsearch.spark.sql") .option("query", myQuery) .option("pushdown", "true") .load("myindex/mytype") .limit(10) // instead of size .select("a","b") // instead of fields