Pyspark有效地在每个窗口中创建模式



我想从现有的数据帧中创建一个基本数据帧,它不包含我想要的所有内容,例如,我有一个数据帧来收集每个人(通过"id"跟踪(每年每月购买的糖果数量(但在这种情况下,每个人并不是每个月都购买糖果(

|id|year_month|num_of_candies_bought
1  2022-01           5
1  2022-03          10
1  2022-04           2

我想要的是通过修复我感兴趣的年份月份来跟踪他们(今年前5个月(

|id|year_month|num_of_candies_bought
1  2022-01           5
1  2022-02           0
1  2022-03          10
1  2022-04           2
1  2022-05           0

我认为这样做的一种方法是使用";交叉连接";但事实证明,这需要很长时间来处理。有没有什么方法可以在不加入的情况下做到这一点?在我的工作中,第一个数据帧非常非常大(例如一百万行(,而第二个数据帧只是固定的(就像本例中只有5行(,而且要小得多。是否有可能(如果需要使用交叉连接(大幅提高性能?

附言:我想把每个人都分开(所以我需要使用window.partition的东西(

我只需为每个id、每个id和year_month添加一个0(零(行
假设df是您的数据帧。

from pyspark.sql import functions as F
# generate a list of all year_month you need
year_month = ["2022-01", "2022-02", "2022-03", "2022-04", "2022-05"]
df_id = (
df.select("id")
.distinct()
.withColumn("num_of_candies_bought", F.lit(0))
.withColumn("year_month", F.explode(F.array(*map(F.lit, year_month))))
)
df = (
df.unionByName(df_id)
.groupBy("id", "year_month")
.agg(F.sum("num_of_candies_bought").alias("num_of_candies_bought"))
)

最新更新