2017-04-13 180 views
0

我想根據數據上的關鍵字段將JSON數據從一個表格插入到其他表格。將JSON數據從一個表格插入HIVE中的另一個表格

我的數據是這樣的

{ 「舍入類型」:{ 「版本」: 「1」, 「OS」: 「MS」, 「類型」: 「NS」, 「車」:」 MH-3412" , 「MOD」:{ 「版本」:[{ 「ABC」:{ 「XYZ」: 「123.dfer」, 「方正」: 「3.0」, 「GHT」: 「佛羅里達」, 「時尚」 :「fg45」,「cdc」:「new」,「dof」:「yes」,「ts」:「2000-04-01T00:00:00.171Z」}}]}}}

{「Rtype 「:{」 VER 「:」 1" , 「OS」: 「MS」, 「類型」: 「NS」, 「車輛」: 「MH-3412」, 「MOD」:{ 「版本」:[{「GAP 「:{」 XVY 「:」 123.dfer 「 」FAH「: 」3.0「, 」GHT「: 」佛羅里達「, 」時尚「: 」fg45「, 」CDC「: 」新「, 」自由度「:」是「,」ts「:」2000-04-01T00:00:00.171Z「}}]}}}

{」R型 「:{」 VER 「:」 1" , 「OS」: 「MS」, 「類型」: 「NS」, 「車輛」: 「MH-3412」, 「MOD」:{ 「版本」:[{」 BOX 「:{」 VOG 「:」 123.dfer」, 「FAH」: 「3.0」, 「傳真」: 「佛羅里達」, 「時尚」: 「fg45」, 「CDC」: 「新」, 「自由度」: 「是」,「ts」:「2000-04-01T00:00:00.171Z」}}]}}}

這裏基於版本,無論是「BOX」還是「GAP」或「ABC」 「我想填充特定的JSON行上的字段到另一個表格

例如:如果版本是」GAP「,然後填充一個表中的特定行,如果它是」BOX「然後填充到另一個表...我的意思是所有行的BOX ...

我該如何使用HIVE來實現這一目標。請幫忙。

注:我的JSON數據是在一個表中與字符串類型的列

+0

數組內總是隻有一個元素嗎? –

+0

JSON無效(丟失:) –

回答

1

演示

create table src (myjson string); 

insert into src values 
    ('{"Rtype":{"ver":"1","os":"ms","type":"ns","vehicle":"Mh-3412","MOD":{"Version":[{"ABC":{"XYZ":"123.dfer","founder":"3.0","GHT":"Florida","fashion":"fg45","cdc":"new","dof":"yes","ts":"2000-04-01T00:00:00.171Z"}}]}}}') 
    ,('{"Rtype":{"ver":"1","os":"ms","type":"ns","vehicle":"Mh-3412","MOD":{"Version":[{"GAP":{"XVY":"123.dfer","FAH":"3.0","GHT":"Florida","fashion":"fg45","cdc":"new","dof":"yes","ts":"2000-04-01T00:00:00.171Z"}}]}}}') 
    ,('{"Rtype":{"ver":"1","os":"ms","type":"ns","vehicle":"Mh-3412","MOD":{"Version":[{"BOX":{"VOG":"123.dfer","FAH":"3.0","FAX":"Florida","fashion":"fg45","cdc":"new","dof":"yes","ts":"2000-04-01T00:00:00.171Z"}}]}}}') 
; 

create table trg_abc (myjson string); 
create table trg_gap (myjson string); 
create table trg_box (myjson string); 

from src 
insert into trg_abc select myjson where get_json_object(myjson,'$.Rtype.MOD.Version[0].ABC') is not null 
insert into trg_gap select myjson where get_json_object(myjson,'$.Rtype.MOD.Version[0].GAP') is not null 
insert into trg_box select myjson where get_json_object(myjson,'$.Rtype.MOD.Version[0].BOX') is not null 
; 
+0

Thanks @Dudu。 ('{「Rtype」:{「ver」:「1」,「os」:「ms」,「type」:「ns」),如果我有很多元素像內部「ABC」 「車輛」: 「MH-3412」, 「MOD」:{ 「版本」:[{ 「ABC」:{ 「XYZ」: 「123.dfer」, 「創建者」: 「3.0」, 「GHT」:「佛羅里達「 」時尚「: 」fg45「, 」CDC「: 」新「, 」自由度「: 」是的「, 」TS「: 」2000-04-01T00:00:00.171Z「},{ 」XYZ「:」 555.dfer 「 」方正「: 」3.0「, 」GHT「: 」中國「, 」時尚「: 」fg45「, 」CDC「: 」新「, 」自由度「: 」是的「, 」TS「:」 2000-04-01T00:00:00.171Z 「},{」 XYZ 「:」 888.dfer 「 」創建者「: 」3.0「, 」GHT「: 」JAPAN「, 」時尚「: 」fg45「,」 CDC 「:」new「,」dof「:」yes「,」ts「:」2000-04-01T00:00:00.171Z「}}]}}}')在情況下會起作用嗎? – BigD

+0

它可能有什麼關係? –

+0

array > – BigD

-1

所有你需要將你的數據存儲爲JSON在蜂巢表的第一:

我假設你的蜂巢表是外部(通常是 - 用SHOW CREATE TABLE your_table檢查它)。
如果是整個數據集就在於一些HDFS/S3的路徑,例如s3a://your_bucket/your_jsons_location/

下載JSON-UDF-1.3.7-JAR-與-dependencies.jar和運行ADD JARS s3a://your_bucket/lib/json-udf-1.3.7-jar-with-dependencies.jar;
那麼你必須創建一個專用的JSON表中的每個JSON模式您有:

CREATE EXTERNAL TABLE boxes 
(Rtype struct<ver:string,os:string,type:string,vehicle:string,MOD:struct<Version:array<struct<BOX:struct<VOG:string,FAH:string,FAX:string,fashion:string,cdc:string,dof:string,ts:string>>>>>) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location 's3a://your_bucket/your_jsons_location/'; 

CREATE EXTERNAL TABLE gaps 
(Rtype struct<ver:string,os:string,type:string,vehicle:string,MOD:struct<Version:array<struct<GAP:struct<XVY:string,FAH:string,GHT:string,fashion:string,cdc:string,dof:string,ts:string>>>>>) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location 's3a://your_bucket/your_jsons_location/'; 

CREATE EXTERNAL TABLE abcs 
(Rtype struct<ver:string,os:string,type:string,vehicle:string,MOD:struct<Version:array<struct<ABC:struct<XYZ:string,founder:string,GHT:string,fashion:string,cdc:string,dof:string,ts:string>>>>>) 
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' location 's3a://your_jsons_location/'; 

現在,如果你運行:

SELECT * FROM boxes; 
SELECT * FROM gaps; 
SELECT * FROM abcs; 

你會看到,每個表解析正確ONL y匹配的jsons(根據create statment中指定的模式)。 每個表中不匹配的都是NULL。

要篩選出unrelevant記錄運行:
SELECT * FROM abcs WHERE Rtype.mod.version[0].abc IS NOT NULL;

注意:這整個解釋假定您jsons存儲在外部蜂巢表(具體我使用S3,但它也可以是HDFS)

+0

我的JSON數據已經在一個HIVe表中作爲一個數據類型爲字符串的列....我想將這個隔離到另一個配置表過濾器和一些過濾的文件...我沒有得到如何從列 – BigD

+0

列數組elemtes我不能得到我的源表中包含json數據的位置作爲字符串....可以告訴我如何獲得「時尚」的價值..我試過這種R型.mod.version [0] .fashion,但獲得NULL – BigD

+0

這是您建議的解決方案?造成故意解析錯誤? –

相關問題