我可以看到 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>
. 所以当我尝试将它插入表时,它会抛出一个错误。
如何将其更改为返回类型为的空数组 array<struct<name: string, jobslots:int>>
以便 Hive's size()
函数在此数组上返回0?
1条答案
按热度按时间mqkwyuun1#
你可以用
collect_list
或者colect_set
对于收集从联接中获取的结构数组,并且联接条件为false,则collect\u list将生成一个空的结构数组。此查询返回大小为0的数组:
结果:
如果您将第一个子查询a中的id更改为与b联接,它将返回一个包含1个元素的数组。而且这些结果都是同一类型的,您可以使用union all轻松地进行检查。
检查结果类型相同:
结果:
如果我尝试用不同的类型(例如array())合并struct的所有空数组,会发生什么情况:
例外情况:
编译语句时出错:失败:并集两侧的semanticexception架构应匹配:列my\ array是第一个表上的array类型,并且类型arraystructname:void,value:void在第二张table上。无法判断空ast的位置。
这说明第一个查询确实返回struct的空数组。您可以轻松地在查询中执行类似的连接。
如何在条件查询中使用它?演示:
case语句非常高兴,并且不会引发有关不兼容类型的异常