web-dev-qa-db-fra.com

Comment interroger un tableau de structures avec Hive (get_json_object) ou json serde

J'essaie d'interroger le fichier d'exemple JSON suivant stocké sur mon HDFS

{
    "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é ce qui 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 souhaite interroger les données de manière à ce qu'elles me reviennent comme telles:

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

Quelqu'un peut-il me fournir 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 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.

5
DatWunGuy102

J'ai trouvé un très bon blog sur: 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 json Tuple et voir comment il fonctionne par rapport à la classe "get_json_object"

9
DatWunGuy102