Spark 数据集唯一 ID 性能 - row_number 对比 monotonically_increasing_id

Spark Dataset unique id performance - row_number vs monotonically_increasing_id

我想为我的数据集行分配一个唯一 ID。我知道有两个实现选项:

  1. 第一个选项:

    import org.apache.spark.sql.expressions.Window;
    ds.withColumn("id",row_number().over(Window.orderBy("a column")))
    
  2. 第二个选项:

    df.withColumn("id", monotonically_increasing_id())
    

第二个选项不是顺序 ID,这并不重要。

我想弄清楚这些实施是否存在任何性能问题。也就是说,如果此选项中的一个与另一个相比非常慢。更有意义的是:"monotonically_increasing_id is very fast over row_number because it's not sequential or ..."

monotically_increasing_id分布,根据数据的partition执行。

row_number() 使用 Window 函数而不使用 partitionBy(如您的情况)未分发。当我们不定义partitionBy时,所有数据都发送给一个执行器来生成行号。

因此,可以肯定 monotically_increasing_id() 在未定义 partitionBy 的情况下会比 row_number() 表现更好

TL;DR 这甚至不是比赛。

从不 使用:

row_number().over(Window.orderBy("a column"))

对于总结结果以外的任何其他内容,已经适合单台机器内存。

要在没有 PARTITION BY 的情况下应用 window 函数,Spark 必须将所有数据洗牌到一个分区中。在任何大型数据集上,这只会使应用程序崩溃。顺序和非分布式甚至都不重要。