更好的 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 语法将一列结构分解成一个表,每个结构成员一列?的主要内容,如果未能解决你的问题,请参考以下文章

SQL一行多列数据分解成多行数据

SQL Server将一列的多行内容拼接成一行的实现方法

SQL Server将一列的多行内容拼接成一行

关于SQL Server将一列的多行内容拼接成一行的问题讨论

将一列拆分为多行

关于SQL Server将一列的多行内容拼接成一行,合并显示在另外表中