我想为数据集行分配唯一的ID。我知道有两种实现选择:
第一个选项:
import org.apache.spark.sql.expressions.Window;
ds.withColumn("id",row_number().over(Window.orderBy("a column")))
第二个选项:
df.withColumn("id", monotonically_increasing_id())
第二个选项不是顺序ID,它并不重要。
我正在试图弄清楚这些实现是否存在任何性能问题。也就是说,如果其中一个选项与另一个相比非常慢。更有意义的是:“monotonically_increasing_id比row_number快得多,因为它不是顺序的......”
答案 0 :(得分:6)
monotically_increasing_id
,它根据数据的分区执行。
而
使用row_number()
函数而不使用Window
(如您的情况)的 partitionBy
未分发。当我们没有定义partitionBy
时,所有数据都会被发送到一个执行器以生成行号。
因此,可以确定monotically_increasing_id()
的效果优于row_number()
,而partitionBy
未定义。
答案 1 :(得分:6)
TL; DR 甚至不是竞争对手。
从不使用:
row_number().over(Window.orderBy("a column"))
除了总结结果之外的任何其他内容,已经适合单个机器内存。
要应用不带PARTITION BY
的窗口函数,Spark必须将所有数据混合到一个分区中。在任何大型数据集上,这只会使应用程序崩溃。顺序而非分布甚至不重要。