【发布时间】:2020-04-13 04:54:56
【问题描述】:
我有以下测试数据,必须借助pyspark检查以下语句(数据实际上非常大:700000笔交易,每笔交易有10+个产品):
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'])
“某个客户 ID 在 x 天内存在的交易的特点是购物车中至少有一件相同的产品。”
到目前为止,我有以下方法(示例 x = 2):
spark = SparkSession.builder \
.master('local[*]') \
.config("spark.driver.memory", "500g") \
.appName('my-pandasToSparkDF-app') \
.getOrCreate()
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
spark.sparkContext.setLogLevel("OFF")
df=spark.createDataFrame(data)
x = 2
win = Window().partitionBy('customerid').orderBy(F.col("date").cast("long")).rangeBetween(-(86400*x), Window.currentRow)
test = df.withColumn("productids", F.array_distinct(F.split("productids", "\;")))\
.withColumn("flat_col", F.array_distinct(F.flatten((F.collect_list("productids").over(win))))).orderBy(F.col("date"))
test = test.toPandas()
因此,从我们回顾过去 2 天的每笔交易中,按 customerid 分组,相应的产品汇总在“flat_col”列中。
但我真正需要的是具有相同 ID 的购物篮的交集。只有这样我才能判断是否有共同的产品。
所以“flat_col”的第五行应该是['G']而不是['P','Q','G','C']。同样,[] 应该出现在“flat_col”的所有其他行中。
非常感谢!
【问题讨论】:
标签: python pandas apache-spark pyspark