Как разбить массив строк JSON на строки? - PullRequest
0 голосов
/ 06 ноября 2019

Моя функция UDF возвращает массив объектов json в виде строки. Как я могу развернуть массив в строки данных?

Если это невозможно, есть ли другой способ (например, использование Struct) для достижения этой цели?

Вот мои данные в формате JSON:

sample json
{
"items":[ {"Name":"test", Id:"1"}, {"Name":"sample", Id:"2"}]
}

И вот как я хочу, чтобы все закончилось так:

test, 1
sample, 2

1 Ответ

1 голос
/ 06 ноября 2019

Идея состоит в том, что искра может прочитать любую паралелизированную коллекцию, поэтому мы берем строку , распараллеливаем ее и читаем как набор данных

Код =>

import org.apache.spark.sql.functions._

val sampleJsonStr = """
     | {
     | "items":[ {"Name":"test", "Id":"1"}, {"Name":"sample", "Id":"2"}]
     | }"""

val jsonDf = spark.read.option("multiLine","true").json(Seq(sampleJsonStr).toDS)
//jsonDf: org.apache.spark.sql.DataFrame = [items: array<struct<Id:string,Name:string>>]

// Finally we explode the json array
val explodedDf = jsonDf.
select("items").
withColumn("exploded_items",explode(col("items"))).
select(col("exploded_items.Id"),col("exploded_items.Name"))

Выход =>

scala> explodedDf.show(false)
+---+------+
|Id |Name  |
+---+------+
|1  |test  |
|2  |sample|
+---+------+
...