0

私は ElasticSearch を初めて使用します。Java で Spark を使用してインデックスからデータを読み取ろうとしています。

作業中のコードがありますが、列がドキュメントの 2 つの「ルート」要素のみであるデータセット内のドキュメントを返しますが、残りのすべてのデータはそれらの列内に 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 に答える