如果问题标题有点令人困惑,请道歉。我是pyspark的新手,正在处理以下问题:
假设我有一个数据框架,其中日期、产品和总订单为三列,并且我有这个数据框架,为期3天。所以类似的东西
date product orders
2022-01-01 whisky 11
2022-01-01 rum 100
2022-01-01 bourbon 5
2022-01-02 whisky 20
2022-01-02 rum 150
2022-01-02 bourbon 7
2022-01-03 whisky 30
2022-01-03 rum 7
2022-01-03 bourbon 3
我想过滤掉最大订单数小于10的任何产品。因此,在上面的数据帧的情况下,包含波旁威士忌作为产品的所有行都将被过滤掉,作为max(波旁威士忌的订单(<10.
输出:
date product orders
2022-01-01 whisky 11
2022-01-01 rum 100
2022-01-02 whisky 20
2022-01-02 rum 150
2022-01-03 whisky 30
2022-01-03 rum 7
最好的方法是什么?我一直在pyspark中查找int Window函数,但一直没能找到正确的方法。
我创建了一个类似的windowspec
windowSpec = Window.partitionBy(groupedDf['product']).orderBy(groupedDf['orders'].desc())
但是在过滤掉数据帧行方面存在问题。
您可以首先为每个product
找到max orders
,然后根据该值进行筛选。
df = df.selectExpr('*', 'max(orders) over (partition by product) as max_orders')
.filter('max_orders >= 10').drop('max_orders')
df.show(truncate=False)
这只是窗口函数的情况。
from pyspark.sql.window import Window
import pyspark.sql.functions as F
window = Window.partitionBy("product").orderBy(F.col("orders").desc())
df.withColumn("rn", F.row_number().over(window)).filter("rn < 10")