更好的HiveQL语法将一列结构分解为一个表,每个结构成员有一列?

时间:2013-05-24 14:55:26

标签: hive hiveql

我在HiveQL中寻找一个argmax()类型的函数,并在他们的bug跟踪器(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

1 个答案:

答案 0 :(得分: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()函数 - 将一个结构数组分解成一个表 - 会做很多你想要的,但不是很完整:我想把一列结构分解成一个表。