【发布时间】: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