2017-07-10 4 views
0

Je suis en train d'interroger le fichier exemple JSON suivant stocké sur mes HDFSComment interroger tableau de struct avec Hive (get_json_object) ou JSON serde

{ 
    "tag1": "1.0", 
    "tag2": "blah", 
    "tag3": "blahblah", 
    "tag4": { 
     "tag4_1": [{ 
       "tag4_1_1": [{ 
         "tag4_1_1_1": { 
          "Addr": { 
           "Addr1": "blah", 
           "City": "City", 
           "StateProvCd": "NY", 
           "PostalCode": "99999" 
          } 
         } 
         "tag4_1_1_1": { 
          "Addr": { 
           "Addr1": "blah2", 
           "City": "City2", 
           "StateProvCd": "NY", 
           "PostalCode": "99999" 
          } 
         } 
        } 
       ] 
      } 
     ] 
    } 
} 

j'ai utilisé comme suit pour créer une table externe sur les données

CREATE EXTERNAL TABLE DB.hv_table 
(
    tag1 string 
, tag2 string 
, tag3 string 
, tag4 struct<tag4_1:ARRAY<struct<tag4_1_1:ARRAY<struct<tag4_1_1_1:struct<Addr 
       Addr1:string 
       , City:string 
       , StateProvCd:string 
       , PostalCode:string>>>>>> 
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 
LOCATION 'HDFS/location'; 

Idéalement, je veux interroger les données telles qu'il me revenir en tant que tel:

select tag1, tag2, tag3, tag4(all data) from DB.hv_table; 

Quelqu'un peut-il me donner un exemple de la façon dont je peux interroger sans l'écrire de la manière suivante:

select tag1, tag2, tag3 
, tag4.tag4_1[0].tag4_1_1[0].tag4_1_1_1.Addr.Addr1 as Addr1 
, tag4.tag4_1[0].tag4_1_1[0].tag4_1_1_1.Addr.City as City 
, tag4.tag4_1[0].tag4_1_1[0].tag4_1_1_1.Addr.StateProvCd as StateProvCd 
, tag4.tag4_1[0].tag4_1_1[0].tag4_1_1_1.Addr.PostalCode as PostalCode 
from DB.hv_table 

Plus important encore, je voudrais de ne pas définir le numéro d'élément de l'élément de tableau. Dans mon exemple, je ne peux cibler que le premier élément de mon tableau (tag4_1_1_1). Je voudrais tout cibler si possible.

Répondre

0

trouvé un blog vraiment bon: ThornyDev

CREATE EXTERNAL TABLE IF NOT EXISTS DB.dummyTable (jsonBlob STRING) 
LOCATION 'pathOfYourFiles'; 

SELECT 
get_json_object(jsonBlob, '$.tag1') AS tag1 
,get_json_object(jsonBlob, '$.tag2') AS tag2 
,get_json_object(jsonBlob, '$.tag3') AS tag3 
,get_json_object(jsonBlob, '$.tag4.tag4_1.tag4_1_1.tag4_1_1_1.Addr.Addr1') AS Addr1 
,get_json_object(jsonBlob, '$.tag4.tag4_1.tag4_1_1.tag4_1_1_1.Addr.City') AS City 
,get_json_object(jsonBlob, '$.tag4.tag4_1.tag4_1_1.tag4_1_1_1.Addr.StateProvCd') AS StateProvCd 
,get_json_object(jsonBlob, '$.tag4.tag4_1.tag4_1_1.tag4_1_1_1.Addr.PostalCode') AS PostalCode 
FROM DB.dummyTable 

Je suis très satisfait, mais je veux vérifier le tuple JSON et de voir comment il fonctionne par rapport à la classe « get_json_object »