복붙노트

[HADOOP] 복잡한 중첩 된 Json에 대한 하이브

HADOOP

복잡한 중첩 된 Json에 대한 하이브

원본 입력 json 코드 조각 ( '/home/user/testsample.json')이 있습니다.

{"key": "somehashvalue","columns": [["Event:2014-03-26 00\\:29\\:13+0200:json","{\"user\":{\"credType\":\"ADDRESS\",\"credValue\":\"01:AA:A4:G1:HH:UU\",\"cAgent\":null,\"cType\":\"ACE\"},\"timestamp\":1395786553,\"sessionId\":1395785353,\"className\":\"Event\",\"subtype\":\"CURRENTLYACTIVE\",\"vType\":\"TEST\",\"vId\":1235080,\"eType\":\"CURRENTLYACTIVE\",\"eData\":\"1\"}",1395786553381001],["Event:2014-03-26 00\\:29\\:13+0200:","",1395786553381001]]}

나는 Json serde를 사용하여 위의 json을 하이브 컬럼으로 파싱하려고 시도했다. 그러나 위의 1395786553381001은 SerDe가 Hive 열에 매핑 할 수있는 형식으로 존재하지 않습니다. 즉,이 값은 Key없이 표시됩니다 (Hive가 Json 열 / 값을 이해하고 있기 때문에 :).

대신에 나는 Array 타입 접근법을 취하여 테이블을 만들었습니다.

CREATE TABLE mytesttable (
  key string, 
  columns array < array< string > >
  )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe';

LOAD DATA LOCAL INPATH '/home/user/testsample.json'
OVERWRITE INTO TABLE mytesttable;

mytesttable에서 열 [0] [1]을 선택하십시오. 준다 -

{"user":{"credType":"ADDRESS","credValue":"01:AA:A4:G1:HH:UU","cAgent":null,"cType":"ACE"},"timestamp":1395786553,"sessionId":1395785353,"className":"Event","subtype":"CURRENTLYACTIVE","vType":"TEST","vId":1235080,"eType":"CURRENTLYACTIVE","eData":"1"}

위의 내용은 깨끗해 보입니다. 그러나 Json 하이브 열에있는 열 [*] [2] 즉 변환이 필요합니다.

나는 '/home/user/testsample.json'에있는 원본 Json을 정리하기 위해 정규식 하이브 쿼리를 작성했습니다 (테이블 tablewithinputjson에 있다고 가정)

SELECT
REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(ij.columna, '["][{]', '{'),'[}]["]', '}'), '\\\\', '') AS columna
FROM tablewithinputjson ij;

위 쿼리는 -

{"key": "somehashvalue","columns": [["Event:2014-03-26 00:29:13+0200:json",{"user":{"credType":"ADDRESS","credValue":"01:AA:A4:G1:HH:UU","cAgent":null,"cType":"ACE"},"timestamp":1395786553,"sessionId":1395785353,"className":"Event","subtype":"CURRENTLYACTIVE","vType":"TEST","vId":1235080,"eType":"CURRENTLYACTIVE","eData":"1"},1395786553381001],["Event:2014-03-26 00:29:13+0200:","",1395786553381001]]}

그러나 여기에서도 다시 1395786553381001은 하이브 열 뒤에 매핑되므로 하이브 열 뒤에 매핑 될 수 없으므로 하이브 열에 매핑 될 수 없습니다.보다 구체적으로이 값은 키없이 표시됩니다. (나는 "test"를 추가 할 수있다 : 1395786553381001 전에 입력 데이터를 커스터마이징하고 싶지 않다.) 너무 많은 커스터마이징은 내가 안락하다. b) 좋은 해결책이 아닌 것처럼 보인다. c) 불필요하다. 내 hadoop 클러스터 공간과 시간 낭비)

더 이상 혼동하지 말고 원래 Json 코드 조각의 모든 필드를 완전히 구문 분석하고 매핑하는 하이브 테이블 형식을 만들 수 없습니다. 어떤 제안이라도 환영합니다. 너무 혼란 스럽다면 알려주세요.

해결법

  1. ==============================

    1.엔드 - 투 - 엔드 솔루션 게시. JSON을 하이브 테이블로 변환하는 단계별 절차 :

    엔드 - 투 - 엔드 솔루션 게시. JSON을 하이브 테이블로 변환하는 단계별 절차 :

    1 단계) 이미없는 경우 maven 설치

    > $ sudo apt-get install maven

    2 단계) 이미 설치하지 않았다면 git 설치

    > sudo git clone https://github.com/rcongiu/Hive-JSON-Serde.git

    3 단계) $ HOME / HIVE-JSON Serde 폴더로갑니다.

    4 단계) serde 패키지 만들기

    > sudo mvn -Pcdh5 클린 패키지

    5 단계) serde 파일은    $ HOME / Hive-JSON-Serde / json-serde / target / json-serde-1.3.7-SNAPSHOT-jar-with-dependencies.jar

    6 단계) 하이브에 종속 ​​항아리로 serde 추가

     hive> ADD JAR $HOME/Hive-JSON-Serde/json-serde/target/json-serde-1.3.7- SNAPSHOT-jar-with-dependencies.jar;
    

    7 단계) $ HOME / books.json에 json 파일 생성 (예)

    {"value": [{"id": "1","bookname": "A","properties": {"subscription": "1year","unit": "3"}},{"id": "2","bookname":"B","properties":{"subscription": "2years","unit": "5"}}]}
    

    8 단계) 하이브에 tmp1 테이블 만들기

     hive>CREATE TABLE tmp1 (
          value ARRAY<struct<id:string,bookname:string,properties:struct<subscription:string,unit:string>>>   
    )
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
    WITH SERDEPROPERTIES ( 
        'mapping.value' = 'value'   
    ) 
    STORED AS TEXTFILE;
    

    9 단계) json에서 tmp1 테이블로 데이터로드

    >LOAD DATA LOCAL INPATH '$HOME/books.json' INTO TABLE tmp1;
    

    10 단계), tmp1 분해 작업을 수행 할 tmp2 테이블을 생성합니다.이 중간 단계는 다중 레벨 json 구조를 여러 행으로 나누는 것입니다 참고 : JSON 구조가 단순하고 단일 레벨이면이 단계를 피하십시오.

    hive>create table tmp2 as 
     SELECT *
     FROM tmp1
     LATERAL VIEW explode(value) itemTable AS items;
    

    11 단계) 하이브 테이블을 만들고 tmp2 테이블에서 값을로드합니다.

    hive>create table books as 
    select value[0].id as id, value[0].bookname as name, value[0].properties.subscription as subscription, value[0].properties.unit as unit from tmp2;
    

    12 단계) 드롭 tmp 테이블

    hive>drop table tmp1;
    hive>drop table tmp2;
    

    13 단계) 하이브 테이블을 테스트합니다.

    hive>select * from books;
    

    산출:

    ID 이름 구독 단위

    1 B 1 년 3

    2 B 2 년 5

  2. from https://stackoverflow.com/questions/23220759/hive-for-complex-nested-json by cc-by-sa and MIT license