By 远方时光原创,可转载,open
合作微信公众号:大数据左右手
背景:
1.数据按照时间排序
2.业务逻辑跟数据时序强相关 (不能时间乱序)
3.目标结果与分组统计相关
业务:
物联网场景经常需要处理时序逻辑,数据按照createAt时序,
T15_st代表上下电,下图中黄色1代表上电阶段,0代表下电阶段
常见的业务比如:每一个上电阶段某个列max值,min值, avg值, count....
思考:T15_st只有0或者1,怎么把T15_st列转为每一个上电阶段,也就是想要得到一个flag列,用于分组(第一次上电, 第二次上电,第三次上电),这样我就可以通过spark groupby(''group_flag'')处理大量的上电阶段,而不需要使用遍历去处理逻辑
备注:SparkSQL优势在于处理分组聚合业务,不擅长处理需要遍历数据的业务,所以能否用SparkSQL在于能否把数据转成分组业务
操作方式
1. 添加第一个辅助列 lag_tag,根据T15_st向下错位
// 创建窗口
val windowSpec = Window.orderBy("timestamp")
// 添加 lag 列来标记 tag 列的变化
val dfWithLag = salesDF.withColumn("lag_tag", lag("T15_