복붙노트

[HADOOP] 다른 평면 / 간단한 하이브 테이블에서 map [structs]를 사용하여 하이브 테이블을로드하는 방법

HADOOP

다른 평면 / 간단한 하이브 테이블에서 map [structs]를 사용하여 하이브 테이블을로드하는 방법

나는 Hive 복합 데이터 유형-map [struct]를 이용하여 단일 테이블에로드하려고하는 Order 및 Order_Detail (1 : n 관계가 있고 order_id에 조인 됨)을 갖는 2 개의 테이블을 가지고 있습니다.

ORDER에 아래 데이터가 있다고 가정하십시오.

Order_id total_amount 고객

123 10.00 1

456 12.00 2

ORDER_DETAILS는

Order_id Order_Item_id Item_amount Item_type

123 1 5.00 A

123 2 5.00 B

456 1 6.00 A

456 2 3.00 비

456 3 3.00 C

모든 주문 열과 order_detail 열을 구조체 맵으로 사용하여 단일 테이블 ORDERS를 만들고 싶습니다. 이를 통해 관련 데이터와 쿼리를 결합하여 빈번한 조인을 피할 수 있습니다. 각 serde와 함께 txt / json 파일 입력을 사용하여 복잡한 데이터 형식으로 테이블을로드하려고 시도했지만 제대로 작동합니다. 그러나이 시나리오에서는 ORCFile 형식의 기존 2 하이브 테이블에서 새 테이블로 데이터를로드하려고합니다. named_struct 함수를 사용하여 기본 삽입을 시도했지만 각 행을 개별적으로로드하고 동일한 order_id를 단일 행으로 결합하지 않습니다.

다음과 같은 예상 출력

123 10.00 1 [1 : {5.00, A}, 2 : {5.00, B}]

456 12.00 2 {1 : {6.00, A}, 2 : {3.00, B}, 3 : {3.00, C}]

하지만 나는

123 10.00 1 [1 : {5.00, A}]

123 10.00 1 [2 : {5.00, B}]

456 12.00 2 {1 : {6.00, A}]

456 12.00 2 {2 : {3.00, B}]

456 12.00 2 {3 : {3.00, C}]

2 개의 테이블 중에서 INSERT INTO 테이블 선택만으로이를 달성하는 방법을 이해하도록 도와주세요. 미리 감사드립니다.

해결법

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

    1.map, named_struct 함수 및 David Worms가 to_map UDF 블로그에 게시 한 사용자 정의 UDF to_map을 사용하여이 작업을 수행하는 방법을 찾았습니다. 여기 샘플이 있습니다.

    map, named_struct 함수 및 David Worms가 to_map UDF 블로그에 게시 한 사용자 정의 UDF to_map을 사용하여이 작업을 수행하는 방법을 찾았습니다. 여기 샘플이 있습니다.

    테이블 주문 생성 (   order_id bigint,   total_amount bigint,   고객 bigint) ROW FORMAT DELIMITED ','으로 종료되는 필드 입력 형식으로 저장 됨 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 테이블 ORDER_DETAILS (   order_id bigint,   Order_Item_id bigint,   item_amount bigint,   Item_type 문자열) ROW FORMAT DELIMITED ','으로 종료되는 필드 입력 형식으로 저장   'org.apache.hadoop.mapred.TextInputFormat' 출력 형식   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 테이블 주문 생성 (   order_id bigint,   Order_Items 맵 >,   total_amount bigint,   고객 bigint) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 입력 형식으로 저장 됨 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'; 덮어 쓰기 테이블 삽입 고르다 a.order_id,   a.order_items,   b.total_amount,   b. 고객 ...에서   (order_id를 order_id로 선택하십시오.     to_map (order_item_id, named_struct ( "item_amount", item_amount, "item_type", item_type)) ORDER_DETAILS 그룹에서 order_id로 order_items로) 주문 참여 b ON (a.order_id = b.order_id);

    주문에서 *를 선택하십시오.

    123 {1 : { "Item_amount": 5, "Item_type": "A"}, 2 : { "Item_amount": 5, "Item_type": "B"}} 10 1

    456 {1 : { "Item_amount": 6, "Item_type": "A"}, 2 : { "Item_amount": 3, "Item_type": "B"}, 3 : { "Item_amount": 3, "Item_type" : "C"}} 12 2

    이것이 모두에게 도움이되기를 바랍니다.

  2. from https://stackoverflow.com/questions/26403396/how-to-load-hive-table-with-mapstructs-from-another-flat-simple-hive-table by cc-by-sa and MIT license