【问题标题】:Get the value from the JSON string从 JSON 字符串中获取值
【发布时间】:2021-07-13 23:24:03
【问题描述】:

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

我怎样才能做到这一点?

【问题讨论】:

  • 您使用的是哪个版本的 spark?
  • 使用版本 3

标签: json scala apache-spark apache-spark-sql


【解决方案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"}|
    +----------------------------------------------------+
    

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2017-07-25
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多