Подтвердить что ты не робот

Взорвать массив объектов в улье

Это ниже таблица улей

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;

Может ли кто-нибудь помочь мне, что я ошибаюсь? Любые предложения будут оценены.

4b9b3361

Ответ 1

Вам нужно взорваться только один раз (в сочетании с 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

Если вы находитесь в Hive 0.10 или новее, вы также можете использовать inline(ARRAY<STRUCT[,STRUCT]>). Он взрывает массив структур в таблицу.