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

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

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;

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


person arsenal    schedule 07.07.2012    source источник
comment
Как насчет этого? выберите user_id, prod_and_ts.product_id как product_id, prod_and_ts.timestamps как отметки времени из SampleTable LATERAL VIEW explode (new_item) exploded_table как prod_and_ts;   -  person Mark Grover    schedule 08.07.2012
comment
@ Mark, Спасибо, Марк, это сработало, не могли бы вы опубликовать это в качестве ответа, чтобы я мог принять его. И не могли бы вы также взглянуть на этот вопрос SO. http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive-using-hiveqlhadoop. Поскольку еще никто не ответил на этот вопрос. Это мне очень поможет. Спасибо за ваше время.   -  person arsenal    schedule 08.07.2012
comment
Рад, что помог. Разместил ответ. Скоро займусь другим вопросом!   -  person Mark Grover    schedule 09.07.2012
comment
эй, вебби, я просто хотел знать, что это хороший вопрос, который ты задавал, но я застрял на первом шаге, только я не могу создать массив структур в улье. было бы действительно полезно, если бы вы могли помочь мне создать массив структур   -  person sachingupta    schedule 06.01.2015


Ответы (3)


Вам нужно взорвать только один раз (в сочетании с БОКОВЫМ ВИДОМ). После разнесения вы можете использовать новый столбец (в моем примере он называется prod_and_ts), который будет иметь тип структуры. Затем вы можете разрешить элементы 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;
person Mark Grover    schedule 09.07.2012
comment
И еще один вопрос, который я разместил, так как это скорее теоретический вопрос, связанный с измерением производительности. http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql. Прошу прощения, если я беспокою вас так сильно, как на SO, здесь не так много экспертов по БОЛЬШИМ ДАННЫМ. Вот почему я звоню вам. Очень признателен за вашу помощь ... - person arsenal; 10.07.2012
comment
Привет, Марк, спасибо за вашу помощь. Я опубликовал аналогичный вопрос, связанный с Exploding Array of Struct in Hive, но на этот раз данные несколько отличаются. Не могли бы вы взглянуть, возможно ли это? http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql - person arsenal; 19.07.2012
comment
Привет, Марк, как мы можем разделить и создать представление для нескольких столбцов массива ‹struct‹ ››. не могли бы вы помочь по моему запросу stackoverflow.com/questions/37282646/ - person Ranjith Sekar; 25.05.2016
comment
Ты хоть представляешь, как сделать множественный взрыв? каждая моя запись имеет 2 столбца структуры, которые мне нужно взорвать, но когда я использую два последовательных разнесения, то время, когда я собираюсь сгруппировать их по ключу. Возвращает ошибку! - person Reihan_amn; 23.02.2018

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

person Tariq    schedule 26.06.2014
comment
Это полезный ответ, но он не дает полного ответа на вопрос. Таким образом, поле верхнего уровня, то есть USER_ID, не будет в результатах. - person Jakub Kukul; 13.03.2017

Вы можете взорвать свой массив следующим образом:

select USER_ID,items from Sample_Table lateral view explode(NEW_ITEM) temp_table as items;
person Sachin    schedule 22.05.2021