Слияние столбцов Apache Spark из массива и структуры внутри массива структуры - PullRequest
0 голосов
/ 23 ноября 2018

Вот схема входящего потока данных.Я использую потоковую обработку spark 2.3.2 для обработки данных.

val schema = StructType(Seq(
            StructField("status", StringType),
            StructField("data", StructType(Seq(
                StructField("resultType", StringType),
                StructField("result", ArrayType(StructType(Array(
                    StructField("metric", StructType(Seq(StructField("application", StringType),
                                                         StructField("component", StringType),
                                                         StructField("instance", StringType)))), 
                    StructField("value", ArrayType(StringType))
                ))))
             )
         )))) 

Вот как я применил схему к rdd dstream.

  val df = rdd.toDS()                        
                    .selectExpr("cast (value as string) as myData") 
                    .select(from_json($"myData", schema).as("myData"))               
                    .select($"myData.data.*")
                    .select("result")

Приведенный выше код приводит к следующемуoutput

{"result":[{"metric":{"application":"A","component":"S","instance":"tp01.net:9072"},"value":["1.542972576979E9","237006995456"]},
       {"metric":{"application":"A","component":"S","instance":"tp02.net:9072"},"value":["1.542972576979E9","237006995456"]},
       {"metric":{"application":"A","component":"S","instance":"tp03.net:9072"},"value":["1.542972576979E9","237006995456"]},
       {"metric":{"application":"B","component":"S","instance":"bp03.net:9072"},"value":["1.542972576979E9","270860144640"]},
       {"metric":{"application":"B","component":"S","instance":"bp04.net:9072"},"value":["1.542972576979E9","270860144640"]},
       {"metric":{"application":"B","component":"S","instance":"ps01.net:9072"},"value":["1.542972576979E9","135177400320"]},
 ]}

Но чтобы извлечь объекты, мне нужно преобразовать вышеприведенное в следующий фрейм данных

application     component       instance            value1              value2
A               S               tp01.net:9072       1.542972576979E9    237006995456
A               S               tp02.net:9072       1.542972576979E9    237006995456
A               S               tp03.net:9072       1.542972576979E9    237006995456
B               S               bp03.net:9072       1.542972576979E9    270860144640
B               S               bp04.net:9072       1.542972576979E9    270860144640
B               S               ps01.net:9072       1.542972576979E9    135177400320

Как видите, каждая строка уже является разобранной строкой.Любые идеи о том, как выбрать значения массива и структуру в одном кадре данных, пожалуйста?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...