如何在Hive中将数据插入Struct数组

时间:2019-01-14 17:32:05

标签: arrays struct hive

我需要在Hive中创建一个结构数组,以便对于一个ID,我可以将多个结构放在一个结构数组中。

我已在下表中创建

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

然后创建第二个表,该表具有上述struct数组(我可以在第一个表上具有struct数组,但我也尝试过但失败了)

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"}

如您在上面看到的,每个ID有多个具有不同结构字段的Node_String。 ID'1'有3行,为了将这3行合为一体,我使用了collect_set

谢谢

1 个答案:

答案 0 :(得分:0)

据我所记得,brickhouse的CollectUDAF可以与原始类型和复杂类型(例如结构)一起使用。看看这个answer