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

需求

    元数据如:Hive实现先排序后分段分组功能,(按某一列,连续相同的值合并)_第1张图片,需要整合成为Hive实现先排序后分段分组功能,(按某一列,连续相同的值合并)_第2张图片

 

如果需将多行合并成一行,按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得到上图表,

然后使用Hive实现先排序后分段分组功能,(按某一列,连续相同的值合并)_第3张图片可以将其合并。

可以简化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两列。

 

你可能感兴趣的:(sql)