簡體   English   中英

在查詢中忽略elasticsearch-spark連接器大小限制參數

[英]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())

但是,這將返回索引中的所有文檔。

實際上,一些參數在設計中被忽略,例如: fromsizefields等。

它們在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM