没有 orderBy 的 Spark 窗口函数

Posted

技术标签:

【中文标题】没有 orderBy 的 Spark 窗口函数【英文标题】:Spark window function without orderBy 【发布时间】:2017-08-06 09:19:18 【问题描述】:

我有一个包含 a, b 列的 DataFrame,我想使用窗口函数通过 a 对数据进行分区,然后为 b 提供唯一索引

val window_filter = Window.partitionBy($"a").orderBy($"b".desc)
withColumn("uid", row_number().over(window_filter))

但是对于这个用例,通过b 订购是不需要的,并且可能很耗时。我如何在不订购的情况下实现这一目标?

【问题讨论】:

我意识到我可以 orderBy 与 partitionBy 相同的列,但我不确定这是否更好。 你可以按字面量 1 订购,如下图Window.partitionBy($"a").orderBy(lit(1)) 你的最终目标是什么?如果你只想要一个唯一的 id,你可以使用 monotonically_increasing_id 而不是使用窗口函数 @rogue-one 如果你解释(true) 你会看到它仍然在使用 lit(1) 进行排序,我不确定它会节省多少...... @rogue-one 的最终目标是为a 中的每个值取任意 1000(或不同的常数) 【参考方案1】:

row_number() 没有 order by 或 with order by 常量具有不确定的行为,并且由于并行处理,每次运行可能会为相同的行产生不同的结果。如果按列的顺序没有改变,也会发生同样的情况,行的顺序可能会因运行而异,您会得到不同的结果。

【讨论】:

以上是关于没有 orderBy 的 Spark 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

Spark 窗口函数 - rangeBetween 日期

没有 ORDER BY 的窗口函数

无法在 Oracle 的窗口函数中使用 ORDER BY 子句

具有大量列的数据帧上的 Spark 窗口函数

使用具有“order by”组件的窗口函数时,结果集的顺序是啥?

hive关于窗口函数的使用