2016-11-17 11 views
0

Я очень новичок в ElasticSearch: Я пытаюсь прочитать данные из индекса, используя Spark в Java.Читайте с Elasticsearch с помощью 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); 

очень упрощенная версия схемы, распознанных Спарк:

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) 

Все, что я могу получить от искры с помощью шоу() что-то вроде

+-------------------+-------------------+ 
|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?)

ответ

0

Решено.

Это было слишком просто, и я даже не пытался: вы можете получить доступ к вложенным данным с помощью точечной нотации. Для того, чтобы иметь значения элемента хххх, просто

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

Результат

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