web-dev-qa-db-ja.com

Hive:JSONの解析

数百万行(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

16
Don P

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

私はこの助けを願っています...

14
Wemerson Cesar

これがあなたがすぐに試すことができるものです、私は 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
8
Sanjiv

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

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

1
HuntingCheetah