2012-09-28 7 views
6

수백만 행 (5TB + 테이블)의 중첩 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

답변

3

당신은 get_json_object를 사용할 수있는 다음과 같은 샘플 SerDe 구현을 사용할 수를 찾을 수 있습니다 :

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

나는이 도움을 바랍니다 ...

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') 기본 하이브 당신이 여기 ..이 작업을 수행 할 수있는 사용이 단계

ADD의 JAR/경로 /로가/하이브 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;