没有 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 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Oracle 的窗口函数中使用 ORDER BY 子句