在pyspark中按时间差将行拆分为多个会话

Posted

技术标签:

【中文标题】在pyspark中按时间差将行拆分为多个会话【英文标题】:split row into multiple sessions by time difference in pyspark 【发布时间】:2016-12-01 12:27:24 【问题描述】:

这是伪数据:

user  ts
--------
1     1
1     3
1     10
1     13
1     21
1     24

如果每个用户的相邻时间差> = 6,它将分为两个会话。因此,上述数据应按如下方式拆分:

user    ts    diff
-------------------
1       1     None
1       3     2
-------------------
1       10    7
1       13    3
-------------------
1       21    8
1       24    3

我了解如何通过下图所示的 Window 函数在 pyspark 中生成差异列,但是如何以 pyspark 的方式将其拆分为每个用户的不同会话?非常感谢!

select
   user,
   ts,
   (lag(ts, 1) over (partition by user order by ts asc)) as diff
from user_event

【问题讨论】:

【参考方案1】:

你有一个正确的开始。 SQL 将继续为:

select user, ts, diff,
       sum(case when diff > 6 then 1 else 0 end) over (partition by user order by ts) as session_grouping
from (select user, ts,
             lag(ts, 1) over (partition by user order by ts asc) as diff
      from user_event
     ) ue;

【讨论】:

行得通!在您上面的示例代码之后,我想这次我更彻底地理解了over (partition by)。非常感谢!

以上是关于在pyspark中按时间差将行拆分为多个会话的主要内容,如果未能解决你的问题,请参考以下文章

将行拆分为多行 Oracle

在 Pyspark 中按顺序应用多个正则表达式进行文本清理的最快方法

Pyspark:将多个数组列拆分为行

Pyspark:将多个数组列拆分为行

如何在pyspark中按列合并多个数据框?

pyspark 将行转换为列