hive表:如何解析可选字段

pgky5nke  于 2021-07-13  发布在  Hadoop
关注(0)|答案(1)|浏览(364)

我正在基于一个包含许多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"}

所以你可以看到 primary_status json blob中有时缺少。
我想创建一个具有以下架构的表:

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 里的table是这样的

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

看起来好像没有 primary_status 字段,它将无法解析其余字段。
有人知道怎么解决这个问题吗?谢谢!

huwehgph

huwehgph1#

您可以直接查询原始数据,而无需定义模式(模式不一致)。每一行都是一条记录,您可以使用json函数解析它:
下面的示例使用上面提供的记录创建一个temp表,使用json的查询返回值,否则就不可用。
如果需要,还可以编写一个cta来转换为标准表。

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

相关问题