2016-09-29 9 views
0

JSON形式の文字列を格納する1つの列を持つデータベーステーブルがあります。文字列自体には、配列のようなマルチプル要素が含まれています。各要素には、複数のキーと値のペアが含まれます。いくつかの値には、複数のキーと値のペアも含めることができます(たとえば、下記の「address」属性など)。コラム「情報」についてはHIVE、配列から要素を取得する方法、要素自体も配列です

People table: 
    Col1  Col2 ..... info 
    aaa  bbb   see below 

、それは次のようなJSON形式の文字列が含まれています

[{"name":"abc", 
    "address":{"street":"str1", "city":"c1"}, 
    "phone":"1234567" 
}, 
{"name":"def", 
    "address":{"street":"str2", "city":"c1", "county":"ct"}, 
    "phone":"7145895" 
} 
] 

私はJSON文字列内の各フィールドの単一の値を取得する必要があります。私の質問は、私は、「アドレス」フィールド内の各フィールドを取得する方法である

SELECT 
    get_json_object(person, '$.name') AS name, 
    get_json_object(person, '$.phone') AS phone, 
    get_json_object(person, '$.address') AS addr 
FROM people lateral view explode(split(regexp_replace(
     regexp_replace(info, '\\}\\,\\{', '\\}\\\\n\\{'), '\\[|\\]',''), '\\\\n')) 
     p as person; 

:以下に示すようにI)は、(爆発呼び出すことで、「アドレス」フィールドを除くすべてのフィールドのことを行うことができると思います。 「アドレス」フィールドには任意の数のキーと値のペアを含めることができ、JSONSerDeは使用できません。私は別のexplode()呼び出しを使うことを考えていますが、動作させることはできません。誰かが助けてくれますか?どうもありがとう。

答えて

1

あなたは

SELECT 
    get_json_object(person, '$.name') AS name, 
    get_json_object(person, '$.phone') AS phone, 
    get_json_object(person, '$.address.street') AS street, 
    get_json_object(person, '$.address.city') AS city, 
    get_json_object(person, '$.address.county') AS county,  
FROM people lateral view explode(split(regexp_replace(
    regexp_replace(info, '\\}\\,\\{', '\\}\\\\n\\{'), '\\[|\\]',''), '\\\\n')) 
    p as person; 
と直接json_objectsを呼び出すことができます
関連する問題