【发布时间】:2019-05-20 08:52:03
【问题描述】:
从 Spark 查询弹性搜索时,仅获取 _id 值,而不获取任何值。
在云中运行的弹性搜索实例。尝试从我的 Windows 笔记本电脑上运行的 Spark 查询
val sparkConf = new SparkConf()
.setMaster("local[*]")
.setAppName("ElasticSearch Query")
.set("es.nodes", "https://my-es-search.xyz.us-east-1.es.amazonaws.com")
.set("es.port", "443")
.set("es.nodes.wan.only", "true")
val spark = SparkSession.builder.config(sparkConf).getOrCreate()
val myRdd = spark.sparkContext.esRDD("my_order_index", "?q=*")
myRdd.take(10).foreach(println)
Maven 依赖:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.12</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch-hadoop</artifactId>
<version>7.0.0</version>
</dependency>
实际结果:
(order-2019-05+2+1301,Map())
(order-2019-05+5+0,Map())
(order-2019-05+1+1283,Map())
(order-2019-05+1+1286,Map())
(order-2019-05+1+1285,Map())
(order-2019-05+3+1359,Map())
(order-2019-05+0+1236,Map())
(order-2019-05+0+1235,Map())
(order-2019-05+2+1297,Map())
(order-2019-05+6+2,Map())
从 Kibana 查询时,文档如下所示:
"_index" : "my_order_index",
"_type" : "order",
"_id" : "order-2019-05+2+1301",
"_score" : 1.0,
"_source" : {
"name":"John",
"orderValue":"1000.00"
}
我关心的是为什么元组 Map 是空的,只有 Map()。如何获取我的文档? 我什至在 Java 中尝试了相同的代码,结果完全相同,一个 Empty Map。但是,我确实在 Java 中启用了调试模式,我可以看到在后台执行的查询,获取所有列。
【问题讨论】:
-
你使用的是什么版本的
elasticsearch和spark!,你能补充一下吗? -
在我看来,您的字段
orderValue是"1000"而不是1000。当我尝试使用您的代码将其从本地弹性读取到 Spark 时,我不断收到NumberFormatException。 (Spark 2.4.0 ES 6.5.4 Scala 2.11.8)。你能试试这个,让我知道你是否有运气val myRdd = spark.sparkContext.esRDD("my_order_index/order", "?q=*", Map[String, String]("es.read.field.include"->"name"))。如果运行,您可能可以将name替换为name, orderValue并查看它是否也有效。让我知道你的观察结果。 -
感谢@kamal 我刚刚尝试通过传递一个附加参数来仅获取所需的列,但它仍然没有获取任何结果。返回相同的空 Map()。我还从 POM 添加了我的依赖项。
标签: scala apache-spark elasticsearch