提问人:Joha 提问时间:5/7/2019 最后编辑:leftjoinJoha 更新时间:5/30/2021 访问量:7726
如何在hive中创建结构体的空数组?
How to create an empty array of struct in hive?
问:
我有一个视图,根据条件,它应该返回一个空数组或一个数组Hive 1.1.0
struct<name: string, jobslots: int>
这是我的代码:
select
case when <condition>
then array()
else array(struct(t1.name, t1.jobslots))
end
from table t1;
这里的问题是,空数组的类型为 。因此,当我尝试将其插入表中时,它会抛出错误。array()
array<string>
如何将其更改为返回一个类型的空数组,以便函数在此数组上返回 0?array<struct<name: string, jobslots:int>>
Hive's size()
答:
0赞
leftjoin
12/20/2020
#1
您可以使用 或 来收集从联接中获取的结构数组,并且连接条件为 false,collect_list将生成一个空的结构数组。collect_list
colect_set
此查询返回大小为 0 的数组:
select a.id, size(collect_list(b.str))=0 array_size_zero
from
(select 2 id ) a
left join (select 1 as id, named_struct('name',null,'value',null) as str) b
on a.id=b.id
group by a.id
结果:
a.id array_size_zero
2 true
如果将第一个子查询 a 中的 id 更改为与 b 联接,它将返回包含 1 个元素的数组。这些结果是同一类型的,您可以使用 union all 轻松检查它。
检查结果属于同一类型:
select a.id, collect_list(b.str) my_array
from
(select 1 id ) a
left join (select 1 as id, named_struct('name',null,'value',null) as str) b
on a.id=b.id
group by a.id
union all
select a.id, collect_list(b.str) my_array
from
(select 2 id ) a
left join (select 1 as id, named_struct('name',null,'value',null) as str) b
on a.id=b.id
group by a.id
结果:
id my_array
1 [{"name":null,"value":null}]
2 []
如果我尝试使用不同类型的结构(例如 array())联合所有空数组会发生什么:
select 1 id, array() my_array
union all
select a.id, collect_list(b.str) my_array
from
(select 2 id ) a
left join (select 1 as id, named_struct('name',null,'value',null) as str) b
on a.id=b.id
group by a.id
例外:
编译语句时出错:失败:SemanticException 架构 联合的两边应匹配: 列 my_array 的类型 第一个表上的数组和类型 array<structname:void,value:void>。无法分辨 空 AST 的位置。
这表明第一个查询实际上返回了结构的空数组。 您可以轻松地在查询中执行类似的联接。
如何在有条件的查询中使用它? 演示:
select a.id, case when true --Put your condition here instead of dummy <true>
then collect_list(a.str) --not empty
else collect_list(b.str) --this one is empty array of the same type
end as my_array
from
(select 2 id, named_struct('name',null,'value',null) str) a
left join (select 1 as id, named_struct('name',null,'value',null) as str) b
on FALSE
group by a.id
CASE表达式非常高兴,并且不会引发有关不兼容类型的异常
评论
array(named_struct('name', NULL, 'jobslot', NULL))
NULL
size
行为很奇怪。正如 OP 提到的返回. 返回select size(null)
-1
select size(array())
1