【问题标题】:How to convert nested JSON to map object in scala如何将嵌套的 JSON 转换为 scala 中的映射对象
【发布时间】:2019-11-24 10:50:12
【问题描述】:

我有以下 JSON 对象:

{
    "user_id": "123",
    "data": {
        "city": "New York"
    },
    "timestamp": "1563188698.31",
    "session_id": "6a793439-6535-4162-b333-647a6761636b"
}
{
    "user_id": "123",
    "data": {
        "name": "some_name",
        "age": "23",
        "occupation": "teacher"
    },
    "timestamp": "1563188698.31",
    "session_id": "6a793439-6535-4162-b333-647a6761636b"
}

我正在使用val df = sqlContext.read.json("json") 将文件读取到数据帧

它将所有数据属性组合成数据结构,如下所示:

root
 |-- data: struct (nullable = true)
 |    |-- age: string (nullable = true)
 |    |-- city: string (nullable = true)
 |    |-- name: string (nullable = true)
 |    |-- occupation: string (nullable = true)
 |-- session_id: string (nullable = true)
 |-- timestamp: string (nullable = true)
 |-- user_id: string (nullable = true)

是否可以将数据字段转换为 MAP[String, String] 数据类型?所以它只和原始json有相同的属性?

【问题讨论】:

  • 嗨!将 Spark Dataframe Row 转换为 Scala Map 并不是一项简单的任务。我可以帮助您,但您必须指定有关您的用例的更多详细信息。你想用Map 对象做什么?您想对嵌套数据执行什么样的操作?
  • 嗨@ÁlvaroValencia,我希望从json 生成镶木地板文件。我在 AWS 上使用 Athena,需要匹配表格式以使数据可查询。谢谢

标签: json scala apache-spark


【解决方案1】:

是的,您可以通过从 JSON 数据中导出 Map[String, String] 来实现,如下所示:

import org.apache.spark.sql.types.{MapType, StringType}
import org.apache.spark.sql.functions.{to_json, from_json}

val jsonStr = """{
    "user_id": "123",
    "data": {
        "name": "some_name",
        "age": "23",
        "occupation": "teacher"
    },
    "timestamp": "1563188698.31",
    "session_id": "6a793439-6535-4162-b333-647a6761636b"
}"""

val df = spark.read.json(Seq(jsonStr).toDS)

val mappingSchema = MapType(StringType, StringType)

df.select(from_json(to_json($"data"), mappingSchema).as("map_data"))

//Output
// +-----------------------------------------------------+
// |map_data                                             |
// +-----------------------------------------------------+
// |[age -> 23, name -> some_name, occupation -> teacher]|
// +-----------------------------------------------------+

首先我们将data字段的内容提取成带有to_json($"data")的字符串,然后我们使用from_json(to_json($"data"), schema)解析并提取Map。

【讨论】:

  • 这行得通!只需要将列附加到 df 并同时使用一个 json。谢谢
  • 没错@stepandel
【解决方案2】:

不确定将其转换为 (String, String) 的 Map 是什么意思,但看看下面是否有帮助。

val dataDF = spark.read.option("multiline","true").json("madhu/user.json").select("data").toDF

dataDF
.withColumn("age", $"data"("age")).withColumn("city", $"data"("city"))
.withColumn("name", $"data"("name"))
.withColumn("occupation", $"data"("occupation"))
.drop("data")
.show

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 2021-06-20
    • 2021-07-06
    • 2017-01-07
    • 1970-01-01
    • 2018-01-02
    相关资源
    最近更新 更多