我正在尝试使用elasticsearch
连接器查询elasticsearch-spark
,我想只返回一些结果:
例如:
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())
然而,这将返回索引中的所有文档。
答案 0 :(得分:0)
如果我理解正确,您正在执行计数操作,该操作不会返回任何文档。您是否希望它返回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输入。
答案 1 :(得分:0)
实际上,设计会忽略某些参数,例如: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时,它还会在所有索引分片上并行运行查询,而不会覆盖它们。
答案 2 :(得分:-1)
这实际上是故意的。由于连接器执行并行查询,因此它还会查看返回的文档数,因此如果用户指定参数,它将根据es.scroll.limit设置覆盖它(请参阅配置选项)。
换句话说,如果您想控制大小,请通过该设置执行此操作,因为它始终优先。
请注意,此参数适用于每个分片。因此,如果您有5个分片,如果此参数设置为1,您可能会下注次数。
请参阅https://www.elastic.co/guide/en/elasticsearch/hadoop/master/configuration.html