[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.엔드 - 투 - 엔드 솔루션 게시. 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
from https://stackoverflow.com/questions/23220759/hive-for-complex-nested-json by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Ruby를 사용하여 Hadoop HDFS에서 파일을 쓰고 읽는 방법? (0) | 2019.07.30 |
---|---|
[HADOOP] 오류 : 생성자 htable (구성 문자열)이 사용되지 않습니다. (0) | 2019.07.30 |
[HADOOP] pyspark로 HBase로 스트리밍하기 (0) | 2019.07.30 |
[HADOOP] Hadoop에서 헤더가있는 파일 처리 (0) | 2019.07.30 |
[HADOOP] 람다 아키텍처 - 왜 배치 레이어 (0) | 2019.07.30 |