JSON 文件上的 Hive 表:如何解析可选字段
Posted
技术标签:
【中文标题】JSON 文件上的 Hive 表:如何解析可选字段【英文标题】:Hive table on JSON file: How to parse optional fields 【发布时间】:2021-04-01 21:13:25 【问题描述】:我正在创建一个基于包含许多 JSON blob 的大 JSON 文件的表。
以下是 JSON 文件中的几行:
"user_id": "047b5bba", "primary_status": "available", "secondary_status": "available", "start_time": "2021-03-01"
"user_id": "047b5bba", "primary_status": "working", "secondary_status": "available", "start_time": "2021-03-02"
"useuser_idrId": "047b5bba", "secondary_status": "working", "start_time": "2021-03-03"
"user_id": "047b5bba", "secondary_status": "complete", "start_time": "2021-03-04"
因此您可以看到 JSON blob 中有时会缺少 primary_status
。
我想创建一个具有以下架构的表:
CREATE TABLE IF NOT EXISTS params.namespace .fct_purecloud_users_incremental (
`user_id` STRING,
`primary_status` STRING,
`secondary_status` STRING,
`start_time` STRING
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE
LOCATION '<file_path>'
但是我发现Hive中的表是这样的
user_id | primary_status | secondary_status | start_time
047b5bba available available 2021-03-01
047b5bba working available 2021-03-02
047b5bba null null null
047b5bba null null null
看起来 JSON blob 中没有 primary_status
字段,它将无法解析剩余的字段。
有谁知道如何解决这个问题?谢谢!
【问题讨论】:
【参考方案1】:您可以直接查询原始数据而无需定义架构(这是不一致的)。每一行都是您可以使用 JSON 函数解析的记录:
以下示例使用您在上面提供的记录创建一个临时表,并且使用 json_extract 的查询返回值或 None 不可用。
如果需要,您还可以编写 CTAS 以转换为标准表格。
WITH example_table AS
(SELECT '"user_id": "047b5bba", "primary_status": "available", "secondary_status": "available", "start_time": "2021-03-01"' as line UNION ALL
SELECT '"user_id": "047b5bba", "primary_status": "working", "secondary_status": "available", "start_time": "2021-03-02"' UNION ALL
SELECT '"user_id": "047b5bba", "secondary_status": "working", "start_time": "2021-03-03"' UNION ALL
SELECT '"user_id": "047b5bba", "secondary_status": "complete", "start_time": "2021-03-04"')
SELECT
json_extract(line, '$.user_id'),
json_extract(line, '$.primary_status'),
json_extract(line, '$.secondary_status'),
json_extract(line, '$.start_time')
FROM
example_table
【讨论】:
谢谢你!这是一个好主意。结果我使用了 serdeproperties 映射,效果很好。以上是关于JSON 文件上的 Hive 表:如何解析可选字段的主要内容,如果未能解决你的问题,请参考以下文章