【问题标题】:Spark window function and taking first and last values per column per partition (aggregation over window)Spark窗口函数并在每个分区的每列中获取第一个和最后一个值(窗口聚合)
【发布时间】:2020-10-02 13:29:46
【问题描述】:

假设我有一个庞大的数据集,我 partitionBy('id')。假设 id 对一个人来说是唯一的,因此每个 id 可能有 n 行,目标是将其减少到 1。 基本上,聚合以使 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 行。

【问题讨论】:

  • 你的样本数据是什么?以及按列的顺序是什么?
  • 按日期排序,但这不是重点。它主要是关于如何聚合它。
  • 窗口函数不用于聚合,你应该使用 group by 来达到你的目的。为什么要混合它们?
  • 我同意,使用窗口函数进行分区。想象一下数据非常大。上面的例子很清楚了吧?

标签: apache-spark pyspark apache-spark-sql


【解决方案1】:

假设您的数据框名称 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) 

如果有特定条件,则按条件更改顺序,以便特定记录位于分区顶部

【讨论】:

  • 错字:row_number().over ...
猜你喜欢
  • 2021-04-06
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2021-07-11
  • 1970-01-01
  • 2012-01-09
  • 1970-01-01
相关资源
最近更新 更多