首页 > 解决方案 > 从 JSON 字符串中获取值

问题描述

我有一个数据框,我正在尝试将数据转换为 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"}

我怎样才能做到这一点?

标签: jsonscalaapache-sparkapache-spark-sql

解决方案


您可以使用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"}|
+----------------------------------------------------+

推荐阅读