我有一个PySpark DataFrame,其中包含“ people”和“ timestamp”列(以及其他与问题无关的列)。解释是用户当时做了一些事情。
我想对一个人的所有行进行分组,其中“时间戳”的差异不超过“阈值”(例如5分钟)。
有什么想法可以在PySpark中实现吗?最好将DataFrame作为结果?
欣赏您的想法!
答案 0 :(得分:0)
假设您的列为['people','timestamp','activity']
SData = Row("people","session_start", "session_end")
def getSessions(dt):
info = dt[1]
data = []
session_start = info[0][0]
session_end = info[0][0]
for x in info[1:]:
if ((x[1] - session_end) > 5*60*1000):
data.append(SData(dt[0], session_start, session_end)
session_start = x[1]
session_end = x[1]
data.append(SData(dt[0],session_start, session_end))
return data
rdd = df.rdd.map(lambda x: (x[0],(x[1],x[2])))
df = rdd.groupByKey().mapValues(lambda x: sorted(x, key=lambda z:z)).flatMap(getSessions).toDF()
基本上将其映射到rdd到df。
没有rdd的另一种方法是在会话的返回数组中创建udf。最后,我们可以使用explode明智地获取数据行。