Вот схема входящего потока данных.Я использую потоковую обработку 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
Как видите, каждая строка уже является разобранной строкой.Любые идеи о том, как выбрать значения массива и структуру в одном кадре данных, пожалуйста?
Спасибо