1

需要一点勺子喂食,如何将复杂的 json 导入 hive。Json 文件格式为:{"some-headers":"", "dump":[{"item-id":"item-1"},{"item-id":"item-2"},...]}. Hive 在dump. Json 文件大小,目前不超过 200MB,但由于是转储,很快就会达到 GB。任何其他可能的方法将不胜感激。

4

2 回答 2

2

发布端到端解决方案。将 JSON 转换为 hive 表的分步过程:

步骤 1) 如果还没有安装 maven

>$ sudo apt-get install maven

步骤 2) 如果还没有安装 git

>sudo git clone https://github.com/rcongiu/Hive-JSON-Serde.git

步骤 3) 进入 $HOME/HIVE-JSON_Serde 文件夹

步骤 4) 构建 serde 包

>sudo mvn -Pcdh5 clean package

步骤 5) serde 文件将位于 $HOME/Hive-JSON-Serde/json-serde/target/json-serde-1.3.7-SNAPSHOT-jar-with-dependencies.jar

步骤 6) 在 hive 中添加 serde 作为依赖 jar

 hive> ADD JAR $HOME/Hive-JSON-Serde/json-serde/target/json-serde-1.3.7- SNAPSHOT-jar-with-dependencies.jar;

步骤 7)在 $HOME/books.json 中创建 json 文件(示例)

{"value": [{"id": "1","bookname": "A","properties": {"subscription": "1year","unit": "3"}},{"id": "2","bookname":"B","properties":{"subscription": "2years","unit": "5"}}]}

步骤 8) 在 hive 中创建 tmp1 表

 hive>CREATE TABLE tmp1 (
      value ARRAY<struct<id:string,bookname:string,properties:struct<subscription:string,unit:string>>>   
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ( 
    'mapping.value' = 'value'   
) 
STORED AS TEXTFILE;

步骤 9) 将数据从 json 加载到 tmp1 表

>LOAD DATA LOCAL INPATH '$HOME/books.json' INTO TABLE tmp1;

步骤 10) 创建一个 tmp2 表对 tmp1 进行分解操作,这个中间步骤是将多级 json 结构分解为多行 注意:如果您的 JSON 结构简单且单级,请避免此步骤

hive>create table tmp2 as 
 SELECT *
 FROM tmp1
 LATERAL VIEW explode(value) itemTable AS items;

步骤 11) 创建 hive 表并从 tmp2 表中加载值

hive>create table books as 
select value[0].id as id, value[0].bookname as name, value[0].properties.subscription as subscription, value[0].properties.unit as unit from tmp2;

步骤 12) 删除 tmp 表

hive>drop table tmp1;
hive>drop table tmp2;

步骤 13) 测试 hive 表

hive>select * from books;

输出:

id名称订阅单位

1 B 1 年 3

2 B 2 年 5

于 2016-08-02T18:07:51.277 回答
0

您可以通过实现 HiveSerDe 将 JSON 导入 Hive。

此链接用作示例实现。

https://github.com/rcongiu/Hive-JSON-Serde

您也可以参考这些链接

如何使用 JSON 数据制作 HIVE 表?

于 2013-02-24T18:32:16.853 回答