Hive实现先排序后分段分组功能,(按某一列,连续相同的值合并)

需求

    元数据如:,需要整合成为

 

如果需将多行合并成一行,按A列排序后,再将B列合并连续值可以使用这个办法。

比如 我们测试了一些路线点,针对这些路线点的数据,可以筛选出某人的超速路段,如上图B列为1的可以理解为在这个点,某车超速了。

而我们需要筛选出这辆车具体在哪些地方超速了。答案就是有三个路段。

 

思路就是:

rank => row_number() over(order by a) 整个时间段的排序。

grouprank => sub(b) over(order by a) 当前点是第几个点。

rank - grouprank = groupid

groupid 就是我们的分组Id。

 因为如果是连续之前rank = a;grouprank =b ; 

当连续的时候 rank 和grouprank 是同时+1。

当不连续的时候 rank +1 ; grouprank不变 正好给我们groupid +1(rank- grouprank)

 

代码:

 

将A行排序,使用if(lag(C,1,C) over(order by A)=C,1,0) as b, B as a得到上图表,

然后使用可以将其合并。

可以简化sql,但这里只提供一个思路。

select
	collect_set(a) as answer
from
	(
	select 
		*, rank - sum(b) over(order by a) as groupid
	from
		(select *,row_number() over(order by a) as rank  from TableName order by a)
	order by 
		a
	)
where 
	b = 1
group by
	groupid
;

Table表中只有转换后的 a,b两列。

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值