0

我对 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 获取这些数据?)

4

1 回答 1

0

解决了。

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

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

结果

+--------+
|xxxx    |
+--------+
|35992783|
|35994342|
|35973981|
|35984563|
|35979054|
+--------+
only showing top 5 rows
于 2016-11-17T15:03:49.480 回答