一尘不染

使用elasticsearch-spark连接器从Spark读取ES:返回所有字段

elasticsearch

我已经在带有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。

这是连接器中的错误还是语法错误?


阅读 1342

收藏
2020-06-22

共1个答案

一尘不染

使用spark elasticsearch连接器,fields因此无法应用投影。

如果希望对映射使用细粒度的控制,则应该DataFrame改用基本上是RDD和模式的映射。

pushdown 还应启用谓词,以将Spark SQL转换(下推)为Elasticsearch Query DSL。

现在是一个半完整的示例:

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
2020-06-22