Spark 数据集唯一 ID 性能 - row_number 对比 monotonically_increasing_id
Spark Dataset unique id performance - row_number vs monotonically_increasing_id
我想为我的数据集行分配一个唯一 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 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 必须将所有数据洗牌到一个分区中。在任何大型数据集上,这只会使应用程序崩溃。顺序和非分布式甚至都不重要。
我想为我的数据集行分配一个唯一 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 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 必须将所有数据洗牌到一个分区中。在任何大型数据集上,这只会使应用程序崩溃。顺序和非分布式甚至都不重要。