PySpark:如何使用窗口函数按固定日期范围和另一列计算值列的总和进行分组?



我有一个Spark数据帧,由三列组成:DateItemValue,分别是DateStringDouble。我想按日期范围(其中每个范围的持续时间为从数据帧中的第一个日期开始的 7 天及以上(和 Item 分组,并计算由日期范围(实际上是周数(和 Item 定义的每个此类组的 Value 总和。

我怀疑 PySpark 的窗口函数应该在某个时候用于日期范围,但在这种情况下无法弄清楚如何实现它们。

让我们首先定义这种方法 -

(a( 为行(每个日期(添加week_start_date列

(b( 使用分组依据week_start_date列(连同"项目"(并计算"价值"的总和

生成一些测试数据

from pyspark.sql.types import *
schema = StructType([StructField('date', StringType(),True),
                     StructField('item', StringType(),True),
                     StructField('value', DoubleType(),True)
    ]
    )
data = [('2019-01-01','I1',1.1),
        ('2019-01-02','I1',1.1),
        ('2019-01-10','I1',1.1),
        ('2019-01-10','I2',1.1),
        ('2019-01-11','I2',1.1),
        ('2019-01-11','I3',1.1)]
df = spark.createDataFrame(data, schema)

生成week_start_date的 Python 函数

from datetime import datetime, timedelta
def week_start_date(day):
    dt = datetime.strptime(day, '%Y-%m-%d')
    start = dt - timedelta(days=dt.weekday())
    end = start + timedelta(days=6)
    return start.strftime('%Y-%m-%d')
spark.udf.register('week_start_date',week_start_date)

使用函数生成week_start_date,然后按week_start_date和项目分组

 df.selectExpr("week_start_date(date) as start_date","date","item as item","value as value" ).
        groupBy("start_date","item").
        agg(sum('value').alias('value_sum')).
        orderBy("start_date").
        show()

相关内容

  • 没有找到相关文章

最新更新