将JSON数据从一个表格插入HIVE中的另一个表格

问题描述:

我想根据数据上的关键字段将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无效(丢失:) –

演示

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

所有你需要将你的数据存储为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

这是您建议的解决方案?造成故意解析错误? –