首页 > 解决方案 > 等效于 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))

标签: sqlarrayshivehiveqlpresto

解决方案


不幸的是,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

推荐阅读