2017-02-04 69 views
2

我已經用elasticsearch-spark連接器在spark-shell中做了一些實驗。調用火花:用elasticsearch-spark連接器從火花中讀取ES:所有字段都返回

] $SPARK_HOME/bin/spark-shell --master local[2] --jars ~/spark/jars/elasticsearch-spark-20_2.11-5.1.2.jar 

在斯卡拉殼:

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.

它是連接器中的錯誤還是我有錯誤的語法?

+0

它火花和ES連接器的您正在使用的版本? – eliasah

+0

Spark 2.0.1和elasticsearch-spark-20_2.11-5.1.2 – Patrick

+0

好吧給我一分鐘來寫答案 – eliasah

回答

1

sparksearch elasticsearch連接器使用fields,因此您無法應用投影。

如果您希望對映射使用細粒度控制,則應該使用DataFrame,而不是基本RDD和模式。

pushdown謂詞也應該啓用。即是否翻譯(下推)星火SQL到Elasticsearch查詢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 

我希望這有助於。

+0

也沒有測試,但它應該工作 – eliasah

+1

我讀完後刪除了括號,它完美的作品。再次感謝@eliasah!它肯定有幫助! – Patrick

+0

只是關於這個問題的最後一個問題:如何使用此語法指定節點?我已閱讀這裏的文檔(https://spark.apache.org/docs/1.6.2/api/python/pyspark.sql.html#pyspark.sql.SQLContext),但我沒有找到答案。 – Patrick

1

有關調用什麼:

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