[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.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.하이브 0.10 이상인 경우 인라인 (ARRAY
)을 사용할 수도 있습니다. 구조체의 배열을 테이블로 분해합니다. 하이브 0.10 이상인 경우 인라인 (ARRAY
)을 사용할 수도 있습니다. 구조체의 배열을 테이블로 분해합니다.
from https://stackoverflow.com/questions/11373543/explode-the-array-of-struct-in-hive by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hbase 신속하게 행 개수를 계산 (0) | 2019.06.01 |
---|---|
[HADOOP] Apache Spark 및 Java를 사용하여 CSV를 DataFrame / DataSet으로 구문 분석 (0) | 2019.06.01 |
[HADOOP] Google의 Dremel은 무엇인가요? Mapreduce와 다른 점은 무엇입니까? (0) | 2019.06.01 |
[HADOOP] 원격 파일을 로컬 디스크에 복사하지 않고 hadoop에 저장 (0) | 2019.06.01 |
[HADOOP] 아브로 대 여기 엔 나무 마루 (0) | 2019.06.01 |