2017-03-15 2 views
2

Ich habe 4 Spalten in Hive-Datenbanktabelle. Die ersten beiden Spalten sind vom Typ string, die 3. und 4. sind JSON. Art. Wie man json Daten in verschiedenen Spalten extrahiert. SERDE, das in Hive verfügbar ist, scheint nur json-Daten zu verarbeiten. Ich habe sowohl normale (STRING) als auch JSON-Daten. Wie kann ich hier Daten in separaten Spalten extrahieren?Konvertieren von JSON in separate Spalten in HIVE

Beispiel:

abc 2341 {max:2500e0,value:"20",Type:"1",ProviderType:"ABC"} {Name:"ABC",minA:1200e0,StartDate:1483900200000,EndDate:1483986600000,Flags:["flag4","flag3","flag2","flag1"]} 

xyz 6789 {max:1300e0,value:"10",Type:"0",ProviderType:"foo"} {Name:"foo",minA:3.14159e0,StartDate:1225864800000,EndDate:1225864800000,Flags:["foo","foo"]} 
+0

Diese sind nicht gültig JSON Dokumente. Die Schlüssel sollten qualifiziert sein, z.B. '" value ":" 20 "' und nicht 'value:" 20 "' –

+0

Danke für das Hinweisen. Lass mich sehen, ob das das Problem löst. –

Antwort

2

eine feste JSON Gegeben

create table mytable (str string,i int,jsn1 string, jsn2 string); 

insert into mytable values 
    ('abc',2341,'{"max":2500e0,"value":"20","Type":"1","ProviderType":"ABC"}','{"Name":"ABC","minA":1200e0,"StartDate":1483900200000,"EndDate":1483986600000,"Flags":["flag4","flag3","flag2","flag1"]}') 
    ,('xyz',6789,'{"max":1300e0,"value":"10","Type":"0","ProviderType":"foo"}','{"Name":"foo","minA":3.14159e0,"StartDate":1225864800000,"EndDate":1225864800000,"Flags":["foo","foo"]}') 
; 

select str,i 
     ,jsn1_max,jsn1_value,jsn1_type,jsn1_ProviderType 
     ,jsn2_Name,jsn2_minA,jsn2_StartDate,jsn2_EndDate 
     ,jsn2_Flags 

from mytable 

     lateral view json_tuple (jsn1,'max','value','Type','ProviderType') 
      j1 as jsn1_max,jsn1_value,jsn1_type,jsn1_ProviderType 

     lateral view json_tuple (jsn2,'Name','minA','StartDate','EndDate','Flags') 
      j2 as jsn2_Name,jsn2_minA,jsn2_StartDate,jsn2_EndDate,jsn2_Flags 
;    

+-----+------+----------+------------+-----------+-------------------+-----------+-----------+----------------+---------------+-----------------------------------+ 
| str | i | jsn1_max | jsn1_value | jsn1_type | jsn1_providertype | jsn2_name | jsn2_mina | jsn2_startdate | jsn2_enddate |   jsn2_flags    | 
+-----+------+----------+------------+-----------+-------------------+-----------+-----------+----------------+---------------+-----------------------------------+ 
| abc | 2341 | 2500.0 |   20 |   1 | ABC    | ABC  | 1200.0 | 1483900200000 | 1483986600000 | ["flag4","flag3","flag2","flag1"] | 
| xyz | 6789 | 1300.0 |   10 |   0 | foo    | foo  | 3.14159 | 1225864800000 | 1225864800000 | ["foo","foo"]      | 
+-----+------+----------+------------+-----------+-------------------+-----------+-----------+----------------+---------------+-----------------------------------+ 
+0

Hey, eigentlich wäre die Eingabe wie im Beispiel angegeben. Sie müssen die Eingabe in das richtige JSON-Format konvertieren, um diese Logik anzuwenden. –

+0

Da ich auch auf Ihren anderen Beitrag geantwortet habe, denke ich, dass wir abgedeckt sind :-) http://stackoverflow.com/questions/42806431/string-transformation-in-hive/42806701#42806701 –

+0

ja, statt jsn1 und jsn2, ich wird regexp_replace code haben .. richtig? Ich teste diese Veränderung. –