Получите значение из строки JSON

#json #scala #apache-spark #apache-spark-sql

Вопрос:

У меня есть фрейм данных, и я пытаюсь преобразовать данные в JSON, чтобы отправить сообщение.

 val df = Seq((123456, 40, "ABCD", "DEFG")).toDF("ID", "RunId", "Val1", "Val2")
val msgDf = df.select(struct("ID", "RunId", "Val1", "Val2").alias("message"))
msgDf.toJSON.show(false)
 

Схема для msgDf

 message:struct
      ID:integer
      RunId:integer
      Val1:string
      Val2:string
 

Вывод, который я получаю, таков

  ---------------------------------------------------------------- 
|value                                                           |
 ---------------------------------------------------------------- 
|{"message":{"ID":123456,"RunId":40,"Val1":"ABCD","Val2":"DEFG"}}|
 ---------------------------------------------------------------- 
 

Я просто хочу запечатлеть нижеприведенное и отправить его в качестве закладной

 {"ID":123456,"RunId":40,"Val1":"ABCD","Val2":"DEFG"}
 

Как я могу этого достичь?

Комментарии:

1. какую версию spark вы используете?

2. использование версии 3

Ответ №1:

Вы можете использовать to_json метод как

 val df = Seq((123456, 40, "ABCD", "DEFG"))
  .toDF("ID", "RunId", "Val1", "Val2")

val msgDf = df.select(to_json(struct("ID", "RunId", "Val1", "Val2")).as("message"))
 

Или просто

 df.select(to_json(struct(df.columns.map(col): _*)).alias("message"))

msgDf.show(false)
 

Или

 Seq((123456, 40, "ABCD", "DEFG")).toDF("ID", "RunId", "Val1", "Val2")
  .toJSON.show(false)
 

Результат:

  ---------------------------------------------------- 
|message                                             |
 ---------------------------------------------------- 
|{"ID":123456,"RunId":40,"Val1":"ABCD","Val2":"DEFG"}|
 ---------------------------------------------------- 
 

Ответ №2:

Не нужно использовать struct toJSON прямое выполнение сделает свою работу:

 val df = Seq((123456, 40, "ABCD", "DEFG")).toDF("ID", "RunId", "Val1", "Val2")

df.toJSON.show(false)
 ---------------------------------------------------- 
|value                                               |
 ---------------------------------------------------- 
|{"ID":123456,"RunId":40,"Val1":"ABCD","Val2":"DEFG"}|
 ----------------------------------------------------