hive 中的原始 json 字段类型

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

如何使用原始 json 字段在 hive 中定义表(不解析,作为纯文本)?

对于以下 s3 文件:

{"first_field":1, "json_field": {"a":{"b":"c"}, "d":"e"}, "sec_field":4}
{"first_field":2, "json_field": {"m":"cv", "d":"e"}, "sec_field":5}
{"first_field":3, "json_field": {"k":1, "d":"e"}, "sec_field":6}

我希望以下查询:

select first_field, json_field, sec_field from web.json_table;

会回来:

1   {"a":{"b":"c"}, "d":"e"}    4
2   {"m":"cv", "d":"e"}         5
3   {"k":1, "d":"e"}            6

我尝试将表格定义如下:

CREATE EXTERNAL TABLE web.json_table(
first_field integer,
json_field string,
sec_field integer
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
location 's3n://my-bucket';

但是查询返回:

hive> select first_field, json_field, sec_field from web.json_table;
OK
1   {   NULL
2   {   NULL
3   {   NULL
json hadoop hive
1个回答
0
投票

我认为你不能有一个通用的方法来映射字符串中的任何 JSON。

您需要将

json_field
定义为 fixed 结构:

{"a":{"b":"c"}, "d":"e"} ==> STRUCT<a:STRUCT<b:STRING>,d:STRING>

{"m":"cv", "d":"e"} ==> STRUCT<m:STRING,d:STRING>

{"k":1, "d":"e"} ==> STRUCT<k:STRING,d:STRING>

对于您实际的 JSON :

CREATE EXTERNAL TABLE web.json_table (
    first_field integer,
    json_field STRUCT<a:STRUCT<b:STRING>,d:STRING,m:STRING,k:STRING>,
    sec_field integer
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
location 's3n://my-bucket';

警告:旧的 Hive 版本不支持 JSON Key 中的大写字母。

编辑:

  1. 创建一个外部 CSV 表
    ext_table
    ,其中单个
    json_data
    列作为字符串(使用不会出现的特殊分隔符,例如
    0x00
    0x01
  2. 使用
    get_json_object
    基于之前的表格
    ext_table
    创建视图来提取所有固定和动态字段
© www.soinside.com 2019 - 2024. All rights reserved.