20

何百万もの行 (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

4

4 に答える 4

8

これがすぐに試すことができるものです。 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 ファイルを Table にロードします。

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
于 2015-07-27T06:18:37.477 に答える
1

JSON でデータを解析するために SerDe を実装することは、ケースにとってより良い方法です。

JSON を解析するために SerDe を実装する方法に関するチュートリアルは、こちらにあります。

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

次のサンプル SerDe 実装も使用できます。

https://github.com/rcongiu/Hive-JSON-Serde

于 2013-02-24T18:48:13.167 に答える