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

时间:2017-02-04 12:32:26

标签: scala apache-spark elasticsearch apache-spark-sql

我在带有elasticsearch-spark连接器的spark-shell中做了一些实验。调用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(顺便说一句,我注意到大小参数也没有被考虑在内:结果包含10个以上的记录)。也许重要的是添加字段是嵌套的,a和b实际上是doc.a和doc.b.

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

3 个答案:

答案 0 :(得分:3)

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

如果您希望对映射使用细粒度控制,那么您应该使用DataFrame代替基本上是RDD和架构的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 谓词将Spark SQL转换(下推)到Elasticsearch Query DSL中。

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

_Check_return_ int       __cdecl abs(_In_ int _X);

答案 1 :(得分:1)

如何打电话:

scala> val es_rdd = sc.esRDD("myindex/mytype",query="myquery", Map[String, String] ("es.read.field.include"->"a,b"))

答案 2 :(得分:0)

您要限制从elasticsearch _search HTTP API返回的字段吗?(我想可以提高下载速度)。

首先,使用HTTP代理查看elastic4hadoop插件的功能(我在MacOS上使用Charles代理的Apache Zeppelin上使用)。这将帮助您了解下推的工作原理。

有几种解决方案可以实现:

1。数据框和下推式

您指定字段,插件将“转发”到ES(此处为_source参数):

POST ../events/_search?search_type=scan&scroll=5m&size=50&_source=client&preference=_shards%3A3%3B_local

  

(-)不适用于嵌套字段。

     

(+)简单,明了,易于阅读

2。 RDD和查询字段

使用JavaEsSpark.esRDD,您可以像以前一样在JSON查询中指定字段。这仅适用于RDD(使用DataFrame时,不发送字段)。

  

(-)没有数据框->没有火花方式

     

(+)更灵活,更易控制