等效于 hive 中 Presto 的 transform() 函数

Posted

技术标签:

【中文标题】等效于 hive 中 Presto 的 transform() 函数【英文标题】:Equivalent of Presto's transform() function in hive 【发布时间】:2020-03-21 16:04:33 【问题描述】:

我似乎在 Hive 中找不到与 Presto 的 transform() 功能等效的功能。

TLDR:如何将函数应用于 hive 中数组的每个元素?

更准确地说,我有一个包含零个或多个结构的数组。每个结构都具有相同的架构并包含多个变量,其中一个 is_done 是一个布尔值。我要做的是评估数组中是否至少存在一个变量 is_done 为 True 的结构。

在 Presto 中,我们将使用 transform 提取布尔值,然后使用 array_max 来查看是否至少有一个为真:

array_max(transform(a.array_task, x -> x.is_done))

【问题讨论】:

我猜是的,transform() 不在 hive 中。但是您正在寻找的功能到底是什么?我们可以建议一个替代方案,或者您可能必须创建一个 UDF。 这是我的第二句话:它将函数应用于数组的所有元素 是的,我明白这一点。但我在问这个函数应该做什么?例如,它应该对所有元素 +1 或将某个字符连接到所有元素。 你说得对@ArunPalanisamy 我不是很清楚,我编辑了我的问题;) 【参考方案1】:

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

【讨论】:

以上是关于等效于 hive 中 Presto 的 transform() 函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询引擎对峙:Spark VS Impala VS Hive VS Presto

Presto 和 Hive

Presto 和 hive 分区发现

无法使用 CSV 文件中的 Presto 创建 Hive 表

Presto 与 hive 的集成不起作用

检查 presto/hive 表中是不是存在列名