Spark Dataset唯一ID性能 - row_number vs monotonically_increasing_id

Hen*_*art 6 scala apache-spark apache-spark-sql apache-spark-dataset

我想为我的数据集行分配唯一的ID.我知道有两种实现选择:

  1. 第一种选择:

    import org.apache.spark.sql.expressions.Window;
    ds.withColumn("id",row_number().over(Window.orderBy("a column")))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二种选择:

    df.withColumn("id", monotonically_increasing_id())
    
    Run Code Online (Sandbox Code Playgroud)

第二个选项不是顺序ID,它并不重要.

我想弄清楚是否存在这些实现的任何性能问题.也就是说,如果其中一个选项与另一个相比非常慢.更有意义的是:"monotonically_increasing_id比row_number快得多,因为它不是顺序的......"

Ram*_*jan 8

monotically_increasing_id分布式,根据数据的分区执行.

row_number()不使用Window函数partitionBy(如在您的情况下)不分发.当我们没有定义时partitionBy,所有数据都被发送到一个执行器以生成行号.

因此,可以肯定的是,monotically_increasing_id()row_number()没有partitionBy定义的更好.


hi-*_*zir 7

TL; DR它甚至不是竞争对手.

永不使用:

row_number().over(Window.orderBy("a column"))
Run Code Online (Sandbox Code Playgroud)

除了总结结果之外的任何东西,已经适合单个机器内存.

要在没有PARTITION BYSpark的情况下应用窗口函数,必须将所有数据混合到一个分区中.在任何大型数据集上,这只会使应用程序崩溃.顺序而非分布甚至不重要.