#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"}|
----------------------------------------------------