2013-02-24 49 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

相關問題