蜂巢中的分组/窗口化
Posted
技术标签:
【中文标题】蜂巢中的分组/窗口化【英文标题】:Grouping/Windowing in hive 【发布时间】:2020-01-23 04:58:09 【问题描述】:在下图中,第一个是有问题的表格(提供的脚本),第二个是预期的输出。 在 C 列中,我们有不同的项目,如 T1、T2、T3,记录将按组提供,T1 记录,然后是 T2 或 T3。它们之间不应该有任何差距,T1会开始和结束,然后只能出现T2项目。但如果 T1 在其他项目之后重新出现,我想以不同的方式考虑它。在 hive/spark 中实现结果的选项有哪些?
我尝试在一列中使用排名,然后在其他列中使用下一个值并尝试运行一些比较,但这没有帮助。
请指教
CREATE TABLE TEST_A (A STRING, B STRING, C STRING);
INSERT INTO TEST_A (A, B, C) VALUES ('a','1-Jan','T1'), ('a','2-Jan','T1'),('a','3-Jan','T2'),('a','4-Jan','T3') ,('a','5-Jan','T1'),('a','6-Jan','T1')
【问题讨论】:
所以在预期的结果中你总是期望只有 3 行?您能否提供更多信息,列 B-First、B-Last、Repeat-First、Repeat-Last 应该是什么? 【参考方案1】:这是一个孤岛问题。我将建议将相邻行的每个“岛”放入单独的行中。
在这种情况下有效的一种方法是使用行号的差异:
select a, c, min(b), max(b)
from (select t.*,
row_number() over (partition by a order by b) as seqnum,
row_number() over (partition by a, c order by b) as seqnum_2
from t
) t
group by a, c, (seqnum - seqnum_2);
如果您真的需要,您可以将其转换为多个列。但是,我认为这只会混淆问题,因为您可能不知道给定 a
/c
组合有多少组。
【讨论】:
以上是关于蜂巢中的分组/窗口化的主要内容,如果未能解决你的问题,请参考以下文章
网易蜂巢微服务架构:用RabbitMQ实现轻量级通信(有彩蛋)
如何在不选择模式配置参数的情况下使用 mongoose 在 MongoDB 模式实例化中的关联数组/对象中执行 foreach?