Spark: как объединить json объектов в массив - PullRequest
0 голосов
/ 19 марта 2020

У меня есть следующий JSON Массив столбцов Dataframe в Spark (2.4)

[{"quoteID":"12411736"},{"quoteID":"12438257"},{"quoteID":"12438288"},{"quoteID":"12438296"},{"quoteID":"12438299"}]

Я пытаюсь объединиться как

{"quoteIDs":["12411736","12438257","12438288","12438296","12438299"]}

Требуется помощь по это

1 Ответ

1 голос
/ 20 марта 2020

Используйте from_json, чтобы прочитать данные столбца как array<struct>, а затем, взорвавшись, можно сгладить данные.

  • наконец, выполните groupBy + collect_list, чтобы создать массив и используйте to_json для создания json требуется.

Example:

val df=Seq(("a","""[{"quoteID":"123"},{"quoteID":"456"}]""")).toDF("i","j")

df.show(false)

//+---+-------------------------------------+
//|i  |j                                    |
//+---+-------------------------------------+
//|a  |[{"quoteID":"123"},{"quoteID":"456"}]|
//+---+-------------------------------------+

val sch=ArrayType(new StructType().add("quoteID",StringType))

val drop_cols=Seq("tmp1","tmp2","j")

//if you need as column in the dataframe
df.withColumn("tmp1",from_json(col("j"),sch)).
withColumn("tmp2",explode(col("tmp1"))).
selectExpr("*","tmp2.*").
groupBy("i").
agg(collect_list("quoteID").alias("quoteIDS")).
withColumn("quoteIDS",to_json(struct(col("quoteIDS")))).
drop(drop_cols:_*).
show(false)

//+---+--------------------------+
//|i  |quoteIDS                  |
//+---+--------------------------+
//|a  |{"quoteIDS":["123","456"]}|
//+---+--------------------------+

//if you need as json string
val df1=df.withColumn("tmp1",from_json(col("j"),sch)).
withColumn("tmp2",explode(col("tmp1"))).
selectExpr("*","tmp2.*").
groupBy("i").
agg(collect_list("quoteID").alias("quoteIDS"))

//toJSON (or) write as json file
 df1.toJSON.first
//String = {"i":"a","quoteIDS":["123","456"]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...