【问题标题】:Databricks Delta Lake - Reading data from JSON fileDatabricks Delta Lake - 从 JSON 文件中读取数据
【发布时间】:2021-12-04 07:15:46
【问题描述】:

我目前正在学习 Databricks,并结合使用 Python (pyspark) 和 SQL 进行数据转换。

到目前为止,我有一个格式如下的 json 文件:

{
    "issuccess": true,
    "jobProcess": "usersList",
    "data": {
        "members": [
            {
                "id": "bot1",     
                "name": "databot",
                "active": true,
                "profile": {
                    "title": "Test Bot",
                    "phone": "1234"
                 },
                 "is_mailbox_active": true
             },
             {
                ....
             }
         ]
     }
}

我可以通过将这些数据转储到临时视图中。遵循 Python (PySpark) 逻辑:

 usersData = spark \
                .read \
                .option("multiLine", True) \
                .option("mode", "PERMISSIVE") \
                .json("C:\\Test\data.json") \
                .createOrReplaceTempView("vw_TestView")

如上,vw_TestView 数据为 struct 格式。

Column DataType
issuccess boolean
jobProcess string
data struct<members:array<struct<id:string, ....>

作为输出,我只需要以适当的格式从 'data' 列数组的 members 中选择/显示数据。

执行 select * from 预计会返回“结果太大....”错误。 另外,由于我最终需要从 'data' 列中选择特定内容,我如何才能为上述视图构建适当的选择查询。

选择查询输出必须如下所示:

id name profile
bot1 databot { "title": "Test Bot","phone": "1234"}
bot2 userbot { "title": "User Bot","phone": "7890"}

如何做到这一点?

我试过表演

%sql
select data.members.* from vw_TestView

'data.members' 列的数据类型不支持此操作,并且会出现以下错误消息:

Can only star expand struct data types.  ..........

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql databricks delta-lake


    【解决方案1】:

    问题是members 是一个数组。在这种情况下,您需要通过以下操作来做到这一点:

    1. 使用select("members") 选择members 字段
    2. 使用explode 函数(doc) 分解members 字段
    3. 从底层结构中提取数据

    类似这样的:

    select col.* from (select explode(data.members) as col from vw_TestView)
    

    附:所有这些也可以直接通过 PySpark 完成。

    【讨论】:

    • 使用 explode(data.memebers) 是正确的,但它不会以我在问题中发布的格式给出结果。基本上,这样做会在一行中为我们提供所有结果,而不是按列细分数据。
    • 您可以尝试更新的答案吗?我错过了目标结构。它有效
    • 啊!!是的,这就像一个魅力。我非常接近得到这个确切的 SQL,但没有像你在这里做的那样完全正确。
    猜你喜欢
    • 1970-01-01
    • 2021-09-05
    • 2020-11-18
    • 1970-01-01
    • 2022-01-28
    • 2022-12-18
    • 1970-01-01
    • 2020-11-17
    • 2021-10-20
    相关资源
    最近更新 更多