복붙노트

[HADOOP] 하이브에 구조체의 배열 분해

HADOOP

하이브에 구조체의 배열 분해

이것은 하이브 테이블 아래에 있습니다.

CREATE EXTERNAL TABLE IF NOT EXISTS SampleTable
(
USER_ID BIGINT,
NEW_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>>
)

그리고 위의 표에있는 데이터입니다.

1015826235     [{"product_id":220003038067,"timestamps":"1340321132000"},{"product_id":300003861266,"timestamps":"1340271857000"}]

배열을 폭발시킨 후 HiveQL에서 아래 출력을 얻을 수있는 방법이 있습니까?

**USER_ID**  |  **PRODUCT_ID**  |   **TIMESTAMPS**
 ------------+------------------+----------------
1015826235      220003038067       1340321132000
1015826235      300003861266       1340271857000

업데이트 됨

위의 형식으로 출력을 얻으려고이 쿼리를 작성했지만 원하는 결과를 얻지 못했습니다.

SELECT myTable1.myCol1,myTable2.myCol2 FROM sampletable st LATERAL VIEW 
explode(st.purchased_item.product_id) myTable1 AS myCol1 LATERAL VIEW 
explode(st.purchased_item.timestamps) myTable2 AS myCol2;

누구든지 내가 뭘 잘못하고 있는지 도울 수 있니? 모든 제안을 주시면 감사하겠습니다.

해결법

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

    1.LATERAL VIEW와 함께 한 번만 분해해야합니다. 폭발 한 후에는 구조체 유형의 새 열 (예 : prod_and_ts)을 사용할 수 있습니다. 그런 다음이 새로운 struct 열의 product_id 및 timestamps 멤버를 확인하여 원하는 결과를 검색 할 수 있습니다.

    LATERAL VIEW와 함께 한 번만 분해해야합니다. 폭발 한 후에는 구조체 유형의 새 열 (예 : prod_and_ts)을 사용할 수 있습니다. 그런 다음이 새로운 struct 열의 product_id 및 timestamps 멤버를 확인하여 원하는 결과를 검색 할 수 있습니다.

    SELECT
       user_id,
       prod_and_ts.product_id as product_id,
       prod_and_ts.timestamps as timestamps
    FROM 
       SampleTable 
       LATERAL VIEW explode(new_item) exploded_table as prod_and_ts;
    
  2. ==============================

    2.하이브 0.10 이상인 경우 인라인 (ARRAY )을 사용할 수도 있습니다. 구조체의 배열을 테이블로 분해합니다.

    하이브 0.10 이상인 경우 인라인 (ARRAY )을 사용할 수도 있습니다. 구조체의 배열을 테이블로 분해합니다.

  3. from https://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive by cc-by-sa and MIT license