Мне нужно создать массив struct в Hive, чтобы для одного идентификатора я мог поместить несколько структур в массив struct.
Я создал таблицу ниже
CREATE TABLE if not exists tbl1
(
sess_id STRING
, source_start_ts STRING
, source_end_ts STRING
,Node_String STRUCT < Node: STRING, Time_Spent:STRING,
Txn_Type: STRING, Txn_Status: STRING, Call_Status: STRING >
)
STORED AS ORC
, а затем создал вторую таблицу с массивом вышеупомянутой структуры (я мог бы иметь массив структур в первой таблице, но я тоже это попробовал и не смог)
CREATE TABLE if not exists tbl2
(
sess_id STRING
,Col2 Array<STRUCT < Node: STRING,
Time_Spent:STRING, Txn_Type: STRING, Txn_Status: STRING,
Call_Status: STRING >>
) STORED AS ORC
Однако, при использовании ниже collect_set для заполнения, я получаю ошибку
insert into table tbl2
select sess_id
, collect_set(Node_String) as Col2
from tbl1
where sess_id = 'abc'
group by sess_id
вот ошибка
Ошибка SQL [40000] [42000]: Ошибка при компиляции оператора: СБОЙ:
UDFArgumentTypeException Принимаются только аргументы примитивного типа
но
структура
был передан в качестве параметра 1.
Я думаю, что collect_set не принимает тип структуры. Есть ли функция, которая делает это?
Вот пример
id, source_start_dt, source_end_dt, Node_string
1,'2019-01-01','2019-01-02' , {"node1","10s","activation", "123", "failed"}
1,'2019-01-01','2019-01-02', {"node2","120s","activation", "123", "Logged"}
1,'2019-01-01','2019-01-02', {"node3","450s","activation", "123", "completed"}
Как вы можете видеть выше, существует несколько Node_String с различными полями структуры для каждого идентификатора. Идентификатор '1' имеет 3 строки, и для того, чтобы свернуть эти три строки в одну, я использовал collect_set
Спасибо