복붙노트

[HADOOP] 어떻게 JSON의 serde를 사용하여 하이브 테이블의 JSON 열을 구문 분석 할 수 있습니까?

HADOOP

어떻게 JSON의 serde를 사용하여 하이브 테이블의 JSON 열을 구문 분석 할 수 있습니까?

나는 이벤트의 이름에 따라 서로 다른 테이블에 드 직렬화 된 JSON 이벤트를로드하려합니다.

지금 내가 같은 테이블에있는 모든 이벤트가, 테이블은 두 개의 열이 EventName을하고 페이로드 (페이로드 이벤트의 JSON 표현을 저장)

CREATE TABLE event( EventName STRING, Payload STRING)

그래서 기본적으로 내가 원하는 다음 표에 데이터를로드하는 것입니다 :

CREATE TABLE TempEvent ( Column1 STRING, Column2 STRING, Column3 STRING )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;

그리고 같은과 이벤트를로드 :

INSERT INTO TempEvent select Payload from event where EventName='TempEvent';

그러나 하이브는 대상 테이블은 3 열이 없다는 제외하고 select 문 단지 1을 던지고있다.

내가 뭔가 잘못하고있는 중이거나 이러한 목표를 달성하기 위해 다른 방법이 있나요?

해결법

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

    1.json으로 serde 그것을 사용하기 위해 한 줄에 하나의 JSON있는 테이블을 필요로한다. 그래서 라인 때문에 사용자의 입력 테이블에서 작동하지 않습니다

    json으로 serde 그것을 사용하기 위해 한 줄에 하나의 JSON있는 테이블을 필요로한다. 그래서 라인 때문에 사용자의 입력 테이블에서 작동하지 않습니다

    TempEvent, {"Column1":"value1","Column2":"value2","Column3":"value3"}
    

    유효한 JSON 없습니다. 그래서 일단 당신은 유효한 JSON을 포함하는 새로운 중간 테이블로 이동 한 다음이 데이터를로드를 사용에서 JSON의 serde 테이블을 채울 필요가 :

    create table event_json (Payload string)
    stored as textfile;
    
    insert into table event_json 
    select Payload from event
    where EventName='TempEvent';
    
    create table TempEvent (Column1 string, Column2 string, Column3 string)
    ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe';
    
    load data inpath '/user/hive/warehouse/event_json' overwrite into table TempEvent;
    

    그럼 당신은이 같은 열을 추출 할 수 있습니다 :

    select Column1, Column2, Column3
    from TempEvent;
    

    소스 테이블은 원래, 당신은 단지 외부 테이블로로 TempEvent 테이블을 만들고 직접 데이터를 당겨 수있는 유효한 JSON 있다면 물론이 모든 처리가 필요하지 않을 것입니다.

  2. from https://stackoverflow.com/questions/30603403/how-can-i-parse-a-json-column-of-a-hive-table-using-a-json-serde by cc-by-sa and MIT license