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 表:如何解析可选字段的主要内容,如果未能解决你的问题,请参考以下文章

Hive解析Json数组超全讲解

Hive解析Json数组超全讲解

如何使用单个字段的混合结构/字符串值解析 Hive 中的 JSON?

Hive 创建表:解析 json 文件时解析错误缺少“>”

hive 存储,解析,处理json数据

如何根据 JSON 中的字段对两个表进行 Hive JOIN?