【问题标题】:Hive table on JSON file: How to parse optional fieldsJSON 文件上的 Hive 表:如何解析可选字段
【发布时间】: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 字段,它将无法解析剩余的字段。

有谁知道如何解决这个问题?谢谢!

【问题讨论】:

    标签: json hadoop hive hiveql amazon-athena


    【解决方案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 映射,效果很好。
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多