2013-02-24 43 views
1

需要一个小勺子喂食,如何将复杂的json导入配置单元。 Json文件格式为:{"some-headers":"", "dump":[{"item-id":"item-1"},{"item-id":"item-2"},...]}。 蜂巢有根据dump给出的字段。与现在一样,Json文件的大小不超过200MB,但是由于它的转储,它很快就会达到GB。任何其他可能的方法将不胜感激。将复杂的Json数据导入配置单元

回答

2

发布最终的端到端解决方案。通过步骤的过程步骤来转换JSON蜂巢表:

步骤1)如果不存在已经

>$ sudo apt-get install maven

步骤2安装行家)如果不存在已经

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

安装GIT中

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

步骤4)构建serd È包

>sudo mvn -Pcdh5 clean package

步骤5)SERDE文件将是 $ HOME /蜂房JSON-SERDE/JSON-SERDE /目标/ JSON-SERDE-1.3.7-快照JAR-与-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 /书籍JSON文件。在蜂房

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(实施例)

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

步骤8)创建TMP1表从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)创建配置单元表和从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>select * from books; 

输出:

ID名称订阅单元

1乙1年3

2 B2年5

+0

“步骤11”应该是: 创建表格书籍为 选择items.id作为id,items.bookname作为名称,items.properties.subscription作为订阅,items.properties.unit作为从tmp2作为单元; – 2016-12-08 06:44:38

+0

有没有可能使用配置单元的UPDATE命令更新此类配置单元表中的任何记录? – 2018-02-12 09:27:42