sql - 等效于 hive 中 Presto 的 transform() 函数
问题描述
我似乎在 Hive中找不到与 Presto 的transform()函数等效的东西。
TLDR:如何将函数应用于 hive 中数组的每个元素?
更准确地说,我有一个包含零个或多个结构的数组。每个结构都具有相同的模式并包含多个变量,其中一个is_done
是布尔值。我想要做的是评估数组中是否至少存在一个变量 is_done 为 True 的结构。
在 Presto 中,我们将使用transform
提取布尔值,然后array_max
查看是否至少有一个为真:
array_max(transform(a.array_task, x -> x.is_done))
解决方案
不幸的是,Hive 没有这样的功能。在不使用额外的 UDF 的情况下,您可以通过爆炸数组和检查结构元素来做到这一点,如下所示:
with your_table as (select array(named_struct('is_done',true),named_struct('is_done',false)) initial_array)
select t.initial_array, max(a.s.is_done) as is_done
from your_table t
lateral view outer explode(initial_array) a as s --s is a struct
group by t.initial_array
;
结果:
initial_array is_done
[{"is_done":true},{"is_done":false}] true
推荐阅读
- visual-studio - 将 TFS 工作区移动到新机器
- r - R中的负向后正则表达式
- javascript - 如何使用 d3.js 通过鼠标悬停显示 XY 图表的 x 和 y 坐标
- python - Pytorch RuntimeError:张量a(4)的大小必须与非单维0的张量b(3)的大小相匹配
- python - 在 Python 中使用 lxml 针对 Schematron 验证带有命名空间的 XML
- vba - 如何在更改字段时运行宏,而不是在该字段的原始条目上运行宏?
- python - df.apply(lambda: x.lower()): 'function' 对象没有属性 'lower'
- docker - 如何在 Docker 中构建 dotnet 核心?
- ios - 在 iOS 13 中单击 webview 的链接时它会崩溃
- node.js - Nodejs获取请求读取正文数据