![](/img/trans.png)
[英]Reading ES from spark with elasticsearch-spark connector: all the fields are returned
[英]elasticsearch-spark connector size limit parameter is ignored in query
我正在嘗試使用elasticsearch-spark
連接器查詢elasticsearch
,我想只返回幾個結果:
例如:
val conf = new SparkConf().set("es.nodes","localhost").set("es.index.auto.create", "true").setMaster("local")
val sparkContext = new SparkContext(conf)
val query = "{\"size\":1}"
println(sparkContext.esRDD("index_name/type", query).count())
但是,這將返回索引中的所有文檔。
實際上,一些參數在設計中被忽略,例如: from
, size
, fields
等。
它們在elasticsearch-spark
連接器內部使用。
不幸的是,沒有記錄這個不受支持的參數列表。 但是,如果您希望使用size
參數,則始終可以依賴於pushdown
謂詞並使用DataFrame
/ Dataset
limit
方法。
所以你應該使用Spark SQL DSL,例如:
val df = sqlContext.read.format("org.elasticsearch.spark.sql")
.option("pushdown","true")
.load("index_name/doc_type")
.limit(10) // instead of size : 10
此查詢將返回連接器默認使用的match_all
查詢返回的前10個文檔。
注意:以下內容在任何級別上都不正確。
這實際上是故意的。 由於連接器執行並行查詢,因此它還會查看返回的文檔數,因此如果用戶指定參數,它將根據es.scroll.limit設置覆蓋它(請參閱配置選項)。
當您查詢elasticsearch時,它還會在所有索引分片上並行運行查詢,而不會覆蓋它們。
如果我理解正確,那么您正在執行計數操作,該操作不會返回任何文檔。 您是否希望它返回1
因為您指定的size: 1
? 那是沒有發生的,這是設計的。
編輯添加:這是elasticsearch-hadoop中count()
的定義:
override def count(): Long = {
val repo = new RestRepository(esCfg)
try {
return repo.count(true)
} finally {
repo.close()
}
}
它根本不考慮查詢,但將整個ES索引視為RDD輸入。
這實際上是故意的。 由於連接器執行並行查詢,因此它還會查看返回的文檔數,因此如果用戶指定參數,它將根據es.scroll.limit設置覆蓋它(請參閱配置選項)。
換句話說,如果要控制大小,請通過該設置執行此操作,因為它始終優先。
請注意,此參數適用於每個分片。 因此,如果您有5個分片,如果此參數設置為1,您可能會下注次數命中。
請參閱https://www.elastic.co/guide/en/elasticsearch/hadoop/master/configuration.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.