我想为我的数据集行分配一个唯一的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上非常快,因为它不是顺序的或...”

    最佳答案

    monotically_increasing_id是分布式的,它根据数据的分区执行。

    然而

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

    因此,对于来说,可以确定的是monotically_increasing_id()的性能将比没有定义row_number()partitionBy更好。

    关于scala - Spark数据集唯一ID的性能-row_number与monotonically_increasing_id,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48500442/

    10-12 22:58
    查看更多