数百万行(5 TB +テーブル)のネストされたJSONからいくつかの値を取得しようとしています。これを行う最も効率的な方法は何ですか?
次に例を示します。
{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}
上記のJSONからこれらの値が必要です。
Country Page impressions_s impressions_o
--------- ----- ------------- --------------
US 2 10 10
これはHiveのjson_Tuple関数です。これが最適な関数かどうかはわかりません。 https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject
Get_json_objectを使用できます。
_ select get_json_object(fieldname, '$.country'),
get_json_object(fieldname, '$.data.ad.s') from ...
_
Json_Tupleを使用するとパフォーマンスが向上しますが、json内のjsonの値を取得する「方法」を見つけました。テーブルをフォーマットするには、次のようなものを使用できます。
from table t lateral view explode( split(regexp_replace(get_json_object(ln, ''$.data.ad.s'), '\\[|\\]', ''), ',' ) ) tb1 as s
上記のコードは、列の「配列」を変換します。
さらにフォーム: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+UDF
私はこの助けを願っています...
これがあなたがすぐに試すことができるものです、私は Json-Ser-De を使うことをお勧めします。
nano /tmp/Hive-parsing-json.json
{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}}
ベーステーブルを作成します。
Hive > CREATE TABLE Hive_parsing_json_table ( json string );
Jsonファイルをテーブルにロードします。
Hive > LOAD DATA LOCAL INPATH '/tmp/Hive-parsing-json.json' INTO TABLE Hive_parsing_json_table;
テーブルをクエリします。
Hive > select v1.Country, v1.Page, v4.impressions_s, v4.impressions_o
from Hive_parsing_json_table hpjp
LATERAL VIEW json_Tuple(hpjp.json, 'country', 'page', 'data') v1
as Country, Page, data
LATERAL VIEW json_Tuple(v1.data, 'ad') v2
as Ad
LATERAL VIEW json_Tuple(v2.Ad, 'impressions') v3
as Impressions
LATERAL VIEW json_Tuple(v3.Impressions, 's' , 'o') v4
as impressions_s,impressions_o;
出力:
v1.country v1.page v4.impressions_s v4.impressions_o
US 227 10 10
Hiveネイティブjson-serde('org.Apache.Hive.hcatalog.data.JsonSerDe')
を使用すると、これを実行できます。手順は次のとおりです。
JARを追加/path/to/Hive-hcatalog-core.jar;
create a table as below
CREATE TABLE json_serde_nestedjson (
country string,
page int,
data struct < ad: struct < impressions: struct < s:int, o:int > > >
)
ROW FORMAT SERDE 'org.Apache.Hive.hcatalog.data.JsonSerDe';
次にデータをロードします(ファイルに保存されます)
LOAD DATA LOCAL INPATH '/tmp/nested.json' INTO TABLE json_serde_nestedjson;
次に、必要なデータを取得します
SELECT country, page, data.ad.impressions.s, data.ad.impressions.o
FROM json_serde_nestedjson;
JSONでデータを解析するためにSerDeを実装することは、ケースにとってより良い方法です。
JSONを解析するためのSerDeの実装方法に関するチュートリアルは、こちらにあります
http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-Apache-Hive/
次のサンプルSerDe実装も使用できます。