需要一点勺子喂食,如何将复杂的json导入蜂巢。 Json文件格式为:{"some-headers":"", "dump":[{"item-id":"item-1"},{"item-id":"item-2"},...]}
。
Hive在dump
下有字段。与现在一样,Json文件大小不超过200MB,但由于它是一个转储,它很快就会达到GB。任何其他可能的方法都将不胜感激。
答案 0 :(得分:2)
发布端到端解决方案。将JSON转换为hive表的逐步过程:
步骤1)如果不存在maven,则安装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 /蜂房JSON-SERDE / JSON-SERDE /目标/ JSON-SERDE-1.3.7-快照罐与 - dependencies.jar 强>
步骤6)在配置单元中添加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 table
加载值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>select * from books;
输出:
id name subscription unit
1 B 1年3
2 B 2年5
答案 1 :(得分:0)