蜂巢中的分组/窗口化

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?

从 SQL Server 中的时间窗口创建分组(组和岛)

preProc = c("center", "scale") 在插入符号包 (R) 和 min-max 归一化中的含义

蜂巢中的文森蒂距离