Hen*_*art 6 scala apache-spark apache-spark-sql apache-spark-dataset
我想为我的数据集行分配唯一的ID.我知道有两种实现选择:
第一种选择:
import org.apache.spark.sql.expressions.Window;
ds.withColumn("id",row_number().over(Window.orderBy("a column")))
Run Code Online (Sandbox Code Playgroud)第二种选择:
df.withColumn("id", monotonically_increasing_id())
Run Code Online (Sandbox Code Playgroud)第二个选项不是顺序ID,它并不重要.
我想弄清楚是否存在这些实现的任何性能问题.也就是说,如果其中一个选项与另一个相比非常慢.更有意义的是:"monotonically_increasing_id比row_number快得多,因为它不是顺序的......"
monotically_increasing_id
分布式,根据数据的分区执行.
而
row_number()
不使用Window
函数partitionBy
(如在您的情况下)不分发.当我们没有定义时partitionBy
,所有数据都被发送到一个执行器以生成行号.
因此,可以肯定的是,monotically_increasing_id()
比row_number()
没有partitionBy
定义的更好.
TL; DR它甚至不是竞争对手.
永不使用:
row_number().over(Window.orderBy("a column"))
Run Code Online (Sandbox Code Playgroud)
除了总结结果之外的任何东西,已经适合单个机器内存.
要在没有PARTITION BY
Spark的情况下应用窗口函数,必须将所有数据混合到一个分区中.在任何大型数据集上,这只会使应用程序崩溃.顺序而非分布甚至不重要.