Как вставить данные в массив Struct в Hive - PullRequest
0 голосов
/ 14 января 2019

Мне нужно создать массив 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

Спасибо

1 Ответ

0 голосов
/ 15 января 2019

Насколько я помню, CollectUDAF brickhouse может работать как с примитивными, так и со сложными типами, такими как структуры. Проверьте этот ответ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...