2012-09-28 15 views
6

पार्सिंग मैं लाखों पंक्तियों (5 टीबी + टेबल) के लिए नेस्टेड JSON से कुछ मान प्राप्त करने का प्रयास कर रहा हूं। ऐसा करने का सबसे प्रभावी तरीका क्या है?हाइव: JSON

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

मैं ऊपर JSON से बाहर इन मूल्यों की आवश्यकता:

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

यह हाइव के json_tuple समारोह है, मुझे यकीन है कि अगर यह सबसे अच्छा कार्य है नहीं कर रहा हूँ

यहाँ एक उदाहरण है। https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject

उत्तर

0

जेएसओएन में अपने डेटा को पार्स करने के लिए एक सेरडी लागू करना आपके मामले के लिए एक बेहतर तरीका है।

कैसे 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

3

आप get_json_object उपयोग कर सकते हैं :

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

आपको json_tuple के साथ बेहतर प्रदर्शन मिलेगा, लेकिन मुझे जेसन के अंदर जेसन में मान प्राप्त करने के लिए "कैसे करें" मिला; अपनी तालिका बनाने के लिए आप इस तरह कुछ उपयोग कर सकते हैं:

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

मैं इस मदद आशा ...

6

यहाँ तुम क्या जल्दी से कोशिश कर सकते हैं, मुझे Json-Ser-De उपयोग करने के लिए सुझाव है।

नैनो /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 
0

का उपयोग छत्ता देशी json-serde('org.apache.hive.hcatalog.data.JsonSerDe') आप यह कर सकते हैं .. यहां दिए गए चरणों

जोड़ें जार/path/to/छत्ता-hcatalog कोर कर रहे हैं।जार;

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; 
संबंधित मुद्दे