5

HDFS に保存されている次の JSON サンプル ファイルをクエリしようとしています。

{
    "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"
                            }
                        }
                    }
                ]
            }
        ]
    }
}

以下を使用して、データに対して外部テーブルを作成しました

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';

理想的には、次のように返されるようにデータをクエリしたいと考えています。

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

次の方法で記述せずにクエリを実行する方法の例を教えてください。

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

最も重要なことは、配列項目の要素番号を定義したくないということです。私の例では、配列の最初の要素 (tag4_1_1_1) のみをターゲットにすることができます。できればすべてを対象にしたい。

4

1 に答える 1