Spark Dataset唯一ID性能 - row_number vs monotonically_increasing_id

时间:2018-01-29 11:41:56

标签: 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")))
    
  2. 第二个选项:

    df.withColumn("id", monotonically_increasing_id())
    
  3. 第二个选项不是顺序ID,它并不重要。

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

2 个答案:

答案 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必须将所有数据混合到一个分区中。在任何大型数据集上,这只会使应用程序崩溃。顺序而非分布甚至不重要。