2012-09-28 4 views
6

Milyonlarca satır (5 TB + tablo) için iç içe JSON'dan bazı değerler almaya çalışıyorum. Bunu yapmanın en etkili yolu nedir?Hive: ayrıştırma JSON

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}} 

Yukarıda JSON dışında bu değerleri gerekir::

Country  Page  impressions_s  impressions_o 
---------  -----  -------------  -------------- 
US    2  10     10 

Bu Hive en json_tuple fonksiyonudur, bu iyi fonksiyon olup olmadığından emin değilim Burada

bir örnektir. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject

cevap

3

Sen get_json_object kullanabileceğiniz aşağıdaki örnek serde uygulamasını kullanabilirsiniz bulunabilir :

select get_json_object(fieldname, '$.country'), 
     get_json_object(fieldname, '$.data.ad.s') from ... 

json_tuple ile daha iyi bir performans elde edeceksiniz ama json içindeki json değerlerini almak için "nasıl yapılır" buldum; böyle bir şey kullanabilirsiniz tablonuzu biçimlendirme için:

from table t lateral view explode(split(regexp_replace(get_json_object(ln, ''$.data.ad.s'), '\\[|\\]', ''), ',')) tb1 as s bu kod üzerinde bir sütununda "Dizi" sizi değiştirecek. daha

formu: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

Ben bu yardımı umut ...

6
Burada

hızlı deneyebilirsiniz budur, ben Json-Ser-De kullanmayı öneririm.

nano /tmp/hive-parsing-json.json

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}} 

baz tablo oluşturun: Tablo için

hive > CREATE TABLE hive_parsing_json_table (json string); 

Yük json dosyası:

hive > LOAD DATA LOCAL INPATH '/tmp/hive-parsing-json.json' INTO TABLE hive_parsing_json_table; 

Sorgu tablosu:

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; 

Çıktı:

v1.country v1.page  v4.impressions_s v4.impressions_o 
US  227  10   10 
0

json-serde('org.apache.hive.hcatalog.data.JsonSerDe') yerli kovan burada .. bunu yapabilirsiniz kullanma adımlar

ADD JAR// yol/kovan-hcatalog çekirdekli vardır.kavanoz;

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

sonra (dosyası halinde) veri yüklemek

LOAD DATA LOCAL INPATH '/tmp/nested.json' INTO TABLE json_serde_nestedjson; 
kullanılarak

ardından gerekli olsun veri

SELECT country, page, data.ad.impressions.s, data.ad.impressions.o 
FROM json_serde_nestedjson;