从Spark查询Elastic搜索返回空Map的值

时间:2019-05-19 19:12:36

标签: scala apache-spark elasticsearch

从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中启用了调试模式,我可以在后台看到执行的查询,并获取所有列。

1 个答案:

答案 0 :(得分:1)

我能够重现此问题(尽管一旦您提到pom,我很确定出了什么问题,我确实花了一些时间重现它)

请注意您拥有的文档。它具有"_type": "order",这意味着被查询到的Elasticsearch使用的是版本 7.0.0

之前的版本 在 7.0.0 之前的

Elasticsearch曾经具有type的概念,并已在版本 7.0.0中将其删除(根据此link

转到浏览器,并在遇到以下具有以下功能的Elasticsearch服务器时,检查number部分下version字段中观察到的内容:

https://my-es-search.xyz.us-east-1.es.amazonaws.com

例如当我在浏览器中命中本地Elasticsearch实例(http://localhost:9200)时,观察到以下内容:

{
  "name" : "jqzqX5D",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "11YmK-ChT4OuXW8Mb9t9tw",
  "version" : {
    "number" : "6.5.4",                    <------- Notice this. That is Elasticsearch version that is being used. 
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "d2ef93d",
    "build_date" : "2018-12-17T21:17:40.758843Z",
    "build_snapshot" : false,
    "lucene_version" : "7.5.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

您需要更新pom文件以使用相同版本的elasticsearch-hadoop

    <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>6.5.4</version>                     <------- Change this. 
    </dependency>

执行此操作后,您应该能够看到地图中显示的值。

希望它有帮助,如果您认为有帮助,可以随时接受答案并投票!!