更好的 HiveQL 语法将一列结构分解成一个表,每个结构成员一列?
Posted
技术标签:
【中文标题】更好的 HiveQL 语法将一列结构分解成一个表,每个结构成员一列?【英文标题】:Better HiveQL syntax to explode a column of structs into a table with one column per struct member? 【发布时间】:2013-05-24 14:55:26 【问题描述】:我在 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
【问题讨论】:
【参考方案1】:一种可能性是嵌套查询:
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() 函数 - 将结构数组分解成一个表 - 做了很多你想要的,但不完全是:我想将一列结构分解成一个表。
【讨论】:
以上是关于更好的 HiveQL 语法将一列结构分解成一个表,每个结构成员一列?的主要内容,如果未能解决你的问题,请参考以下文章