Читайте с Elasticsearch с Spark, получая точные поля
Я очень новичок в ElasticSearch: я пытаюсь читать данные из индекса, используя Spark в Java.
У меня есть рабочий фрагмент кода, но он возвращает документ в наборе данных, где столбцы - это только два "корневых" элемента документа, а все остальные данные хранятся в этих столбцах в формате 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)
Все, что я могу получить от Spark с помощью show(), это что-то вроде
+-------------------+-------------------+
|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
Есть ли способ получить данные внутри каждой строки (например, bbbb), не обрабатывая их в Spark? (т.е. есть ли способ получить эти данные напрямую из ElasticSearch?)
1 ответ
Решаемые.
Это было слишком просто, и я даже не пытался: вы можете получить доступ к вложенным данным, используя точечную запись. Чтобы иметь значения элемента хххх, просто
df1.select("aaaa.xxxx").show(5, false);
Результат
+--------+
|xxxx |
+--------+
|35992783|
|35994342|
|35973981|
|35984563|
|35979054|
+--------+
only showing top 5 rows