PySpark DataFrame: отмечать строки, в которых изменяется значение некоторых столбцов - PullRequest
0 голосов
/ 29 августа 2018

У меня есть PySpark DataFrame со столбцами people и timestamp (плюс дополнительные столбцы, которые не имеют отношения к проблеме). Интерпретация заключается в том, что пользователь что-то сделал в то время.

Я хотел бы сгруппировать все строки одного «человека», где «отметки времени» не отличаются больше, чем «пороговое» значение (например, 5 минут).

Есть идеи, как мне этого добиться в PySpark? Предпочтительно с DataFrame в качестве результата?

Цените свои мысли!

1 Ответ

0 голосов
/ 29 августа 2018

Предположим, у вас есть столбцы как ['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()

В основном сопоставьте его с обратной стороной к df.

Другой подход без rdd - создать udf возвращаемые массивы сессий. Наконец, мы можем использовать Explode для получения строки данных.

...