在 Spark SQL 中提取键值对,其中键是 URL,值是字符串

问题描述 投票:0回答:1

我有一个如下的 JSON 对象

"data": [
    {
        "keyId": <guid>,
        "keyContext":
            "keyContextValue":
                "https://access.dummy.com/training/date/last_modified_dtm":"2024-02-01 17:02:41",
                "https://access.dummy.com/training/id/training_id":"300",
                "https://access.dummy.com/training/name/training_name":"Dummy Training"
    }
]

我能够使用 Spark SQL 中的 get_json_object 函数提取值直到 KeyContext:KeyContextValue Array。但我的要求是提取该数组中的实际值,如下所示。

密钥ID 最后修改的_dtm training_id 培训名称
2024-02-01 300 假人训练

由于密钥是一个 URL,我不知道如何提取该值。有人可以协助如何使用 Spark SQL 来实现这一目标吗?

pyspark apache-spark-sql aws-databricks
1个回答
0
投票

请找到

simple
逻辑。尝试了不同的方式。

您所需要的只是

  • 从 json 对象中提取所需列的架构。

    'data ARRAY<STRUCT<keyContext: STRUCT<keyContextValue: MAP<STRING, STRING>>, keyId: STRING>>'

  • 最终输出列的架构。

    'last_modified_dtm timestamp, training_id int, training_name string'

然后利用

from_json
等内置函数从 json 中提取列,并使用
from_csv
来转换所需的输出。

SELECT    
    inline(
        transform(
            from_json(
                data, 
                'data ARRAY<STRUCT<keyContext: STRUCT<keyContextValue: MAP<STRING, STRING>>, keyId: STRING>>'
            ).data.keyContext.keyContextValue,
            e -> from_csv(
                concat_ws(',', map_values(e)),
                'last_modified_dtm timestamp, training_id int, training_name string'
            )
        )
    )
FROM <table_name>
© www.soinside.com 2019 - 2024. All rights reserved.