Apache spark pyspark collect_列表,但限制为最大N个结果

Apache spark pyspark collect_列表,但限制为最大N个结果,apache-spark,pyspark,Apache Spark,Pyspark,我有以下pyspark逻辑用于对一些目标列进行分组,然后将另一个目标列收集到一个数组中: ( df .groupBy(groupby_cols) .agg( F.collect_list( F.col(target_col) ).alias(target_col) ) ) 我希望将结果限制为每个收集的列表最多保留N值,以便生成的目标列由数组长度最多为N的单元格组成 现在,我可以在pyspark中通过一个UD

我有以下pyspark逻辑用于对一些目标列进行分组,然后将另一个目标列收集到一个数组中:

(
    df
    .groupBy(groupby_cols)
    .agg(
        F.collect_list(
            F.col(target_col)
        ).alias(target_col)
    )
)
我希望将结果限制为每个收集的列表最多保留
N
值,以便生成的目标列由数组长度最多为
N
的单元格组成

现在,我可以在pyspark中通过一个UDF实现这一点,该UDF采用
目标列,并在每个单元格上应用lambda:
lambda x:x[:N]
,但这似乎是实现我寻求的行为的一种低效手段。

from pyspark.sql import Window, functions as F

(
    df
    .withColumn("rn", F.row_number().over(
        Window.partitionBy(groupby_cols).orderBy(orderby_cols) # orderby_cols can be replaced by F.rand(1) if you don't mind which will be stayed/dropped
        )) # this will count from 1, for every element in the groupby_cols
    .filter(f"rn <= {N}") # removes all instances that larger than N
    .groupBy(groupby_cols)
    .agg(F.collect_list(F.col(target_col)).alias(target_col))
)
从pyspark.sql导入窗口,函数为F
(
df
.带列(“rn”,F.行号()。超过(
Window.partitionBy(groupby_cols).orderBy(orderBy_cols)#orderBy_cols可以替换为F.rand(1),如果您不介意保留/删除哪个
))#对于groupby_cols中的每个元素,这将从1开始计算
.过滤器(f“rn