spark窗口函数,每个分区每列取第一个和最后一个值(通过窗口聚合)

nhhxz33t  于 2021-05-24  发布在  Spark
关注(0)|答案(1)|浏览(741)

假设我有一个巨大的数据集 partitionBy('id') . 假设id对于一个人是唯一的,那么每个id可以有n行,目标是将其减少到一行。基本上,聚合以使id不同。

w = Window().partitionBy(id).rowsBetween(-sys.maxsize, sys.maxsize)

test1 = {
    key: F.first(key, True).over(w).alias(key)
    for key in some_dict.keys()
    if (some_dict[key] == 'test1')
}
test2 = {
    key: F.last(key, True).over(w).alias(k)
    for k in some_dict.keys()
    if (some_dict[k] == 'test2')
}

假设我有 some_dict 如果值为test1或test2,并且基于该值,我将取上面所示的第一个或最后一个。
我该如何调用聚合并减少它?

cols = {**test1,**test2}
 cols = list(cols.value())
 df.select(*cols).groupBy('id').agg(*cols) # Doesnt work

上述显然行不通。有什么想法吗?这里的目标是:我有5个唯一的id和25行,每个id有5行。我想把它从25行减少到5行。

cvxl0en2

cvxl0en21#

假设您的Dataframe名df包含下面的重复用法方法

from pyspark.sql.functions import row_number 
from pyspark.sql.window import Window 
window = Window.partitionBy(df['id']).orderBy(df['id'])

final = df.withColumn("row_id", row_number.over(window)).filter("row_id = 1")
final.show(10,False)

在有特定条件的情况下更改order by condition,以便特定的记录位于分区的顶部

相关问题