【问题标题】:Read from Elasticsearch with Spark getting precise fields从 Elasticsearch 中读取,使用 Spark 获取精确字段
【发布时间】:2023-03-14 08:32:02
【问题描述】:

我是 ElasticSearch 的新手:我正在尝试使用 Java 中的 Spark 从索引中读取数据。

我有一段工作代码,但它返回数据集中的文档,其中列只是文档的两个“根”元素,而所有剩余的数据都以 JSON 格式存储在这些列中。

这是我的代码:

SparkConf sparkConf = new SparkConf(true);
    sparkConf.setAppName(Test.class.getName());

    SparkSession spark = null;
    try {
      spark = SparkSession.builder().config(sparkConf).getOrCreate();
    } catch (Exception e) {
      sparkConf.setMaster("local[*]");
      sparkConf.set("spark.cleaner.ttl", "3600");
      sparkConf.set("es.nodes", "1.1.1.1");
      sparkConf.set("es.port", "9999");
      sparkConf.set("es.nodes.discovery", "false");
      sparkConf.set("es.nodes.wan.only", "true");
      spark = SparkSession.builder().config(sparkConf).getOrCreate();
      Logger rootLogger = Logger.getRootLogger();
      rootLogger.setLevel(Level.ERROR);
    }

    SQLContext sqlContext = spark.sqlContext();

    Dataset<Row> df1 = JavaEsSparkSQL.esDF(sqlContext, "index/video");

    df1.printSchema();
    df1.show(5, false);

Spark 推断出的一个非常简化版的架构是:

root
 |-- aaa: struct (nullable = true)
 |    |-- bbbb: array (nullable = true)
 |    |    |-- cccc: struct (containsNull = true)
 |    |    |    |-- dddd: string (nullable = true)
 |    |    |    |-- eeee: string (nullable = true)
 |    |-- xxxx: string (nullable = true)
 |-- ffff: struct (nullable = true)
 |    |-- gggg: long (nullable = true)
 |    |-- hhhh: boolean (nullable = true)
 |    |-- iiii: struct (nullable = true)
 |    |    |-- vvvv: string (nullable = true)
 |    |    |-- llll: array (nullable = true)
 |    |    |    |-- oooo: struct (containsNull = true)
 |    |    |    |    |-- wwww: long (nullable = true)
 |    |    |    |    |-- rrrr: string (nullable = true)
 |    |    |    |    |-- tttt: long (nullable = true)
 |    |    |-- pppp: string (nullable = true)

我可以使用 show() 从 Spark 获得的只是类似于

+-------------------+-------------------+
|aaaa               |ffff               |
+-------------------+-------------------+
|[bbbb,cccc]        |[1,false,null]     |
|[bbbb,dddd]        |[1,false,null]     |
|[bbbb]             |[1,false,null]     |
|[bbbb]             |[1,false,null]     |
|[null,eeee]        |[1,false,null]     |
+-------------------+-------------------+
only showing top 5 rows

有没有一种方法可以在不在 Spark 中处理它们的情况下获取每行中的数据(例如 bbbb)? (即有没有办法直接从 ElasticSearch 获取这些数据?)

【问题讨论】:

    标签: java elasticsearch apache-spark elasticsearch-spark


    【解决方案1】:

    解决了。

    这太简单了,我什至没有尝试:您可以使用点符号访问嵌套数据。要获得 xxxx 项的值,只需

    df1.select("aaaa.xxxx").show(5, false);
    

    结果

    +--------+
    |xxxx    |
    +--------+
    |35992783|
    |35994342|
    |35973981|
    |35984563|
    |35979054|
    +--------+
    only showing top 5 rows
    

    【讨论】:

      猜你喜欢
      • 2020-04-30
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 2018-10-20
      • 2020-02-19
      • 1970-01-01
      相关资源
      最近更新 更多