2

我在 HiveQL 中寻找 argmax() 类型函数,并在他们的错误跟踪器 ( https://issues.apache.org/jira/browse/HIVE-1128 ) 中发现了一个几乎没有记录的功能,它通过使用 max( ) 的结构,它根据第一个元素找到最大值并返回整个结构。(实际上,也许 max() 会通过查看后续元素来打破关系?我不知道。)

无论如何,如果我本质上想选择包含某个列的最大值的整行,我可以先将该行打包成一个具有比较值的结构,然后提取最大结构以重建最佳行。但是语法是重复的和丑陋的。有更好的方法吗?(我猜自加入是另一种选择,但似乎不太优雅,而且我猜效率较低?)

示例表:

id,val,key
1,1,A
1,2,B
1,3,C
1,2,D
2,1,E
2,1,U
2,2,V
2,3,W
2,2,X
2,1,Y

HiveQL:

select 
  max(struct(val, key, id)).col3 as max_id,  -- for illustration, grouping on id anyway
  max(struct(val, key, id)).col1 as max_val,
  max(struct(val, key, id)).col2 as max_key
from test_argmax
group by id

结果:

max_id,max_val,max_key
1,3,C
2,3,W
4

1 回答 1

0

一种可能性是嵌套查询:

select
  best.id as id,
  best.val as val,
  best.key as key
from (
  select 
    max(struct(val, key, id)) as best 
  from test_argmax
  group by id
)

但您似乎无法选择最佳。*(它认为这是一个表别名)因此需要明确列出所有结构成员。看起来 inline() 函数 - 将结构数组分解成一个表 - 做了很多你想要的,但不完全是:我想将一列结构分解成一个表。

于 2013-05-29T19:37:30.267 回答