У меня есть следующие тестовые данные. С этими данными, если нужно запрограммировать в pyspark следующее правило (в действительности данные действительно большие):
import pandas as pd
import datetime
data = {'date': ['2014-01-01', '2014-01-02', '2014-01-03', '2014-01-04', '2014-01-05', '2014-01-06'],
'customerid': [1, 2, 2, 3, 4, 3], 'productids': ['A;B', 'D;E', 'H;X', 'P;Q;G', 'S;T;U', 'C;G']}
data = pd.DataFrame(data)
data['date'] = pd.to_datetime(data['date'])
Правило гласит:
"Для custommerid существует более x транзакций с одним идентичным продуктом в корзине в течение y дней. "
В моем примере я вернул go назад x = 2 дня и проверил, по крайней мере, y = 1 совпадающий параметр Customerid. Результат должен выглядеть следующим образом:
date |customerid|result
2014-01-01|1 |0
2014-01-02|2 |0
2014-01-03|2 |0
2014-01-04|3 |0
2014-01-05|4 |0
2014-01-06|3 |1
Для временного окна в 2 дня, только для 2014-01-06 у нас есть случай, когда происходит идентичный customerid (customerid 3 на 2014-01-04) и есть также один соответствующий продукт (G).
Я знаю, что мог бы использовать временное окно, подобное этому:
win = Window().partitionBy('customerid').orderBy((F.col('date')).cast("long")).rangeBetween(
-(2*86400), Window.currentRow)
К сожалению, в данный момент я не продвигаюсь дальше. Я также абсолютно не знаю, как сравнивать продукты, так как они всегда доступны только в виде длинной строки.
Спасибо!