Spark合并改变unionAll的顺序
Spark coalesce changing the order of unionAll
我有 2 个数据框,我尝试对其执行 unionAll。
DF3=DF1.unionAll(DF2)
DF3.coalesce(1).write.csv("/location")
合并后 DF1 总是放在 DF2 下,我明白这是因为较小的分区排在最后,如下所示:
.
有什么办法可以让我们的订单和我的工会一样?是DF1在前,DF2在合并后。
您是否尝试在合并之前使用 row_number?
from pyspark.sql import SparkSession, functions as F
from pyspark.sql.window import Window
DF3 = DF1.unionAll(DF2)\
.withColumn("p", F.row_number().over(Window.orderBy(F.lit(None))))\
.coalesce(1)\
.orderBy(F.col("p"))\
.drop("p")
DF3.write.csv("/location")
- 我正在创建一个名为“p”的新列,并使用 row_number 和排序方式 None 为每一行分配一个增量编号(如果您想排序,可以使用任何列名通过该特定列)
- 合并后我们将行排序回初始顺序
- 在写入 csv 之前删除“p”列
我有 2 个数据框,我尝试对其执行 unionAll。
DF3=DF1.unionAll(DF2)
DF3.coalesce(1).write.csv("/location")
合并后 DF1 总是放在 DF2 下,我明白这是因为较小的分区排在最后,如下所示:
有什么办法可以让我们的订单和我的工会一样?是DF1在前,DF2在合并后。
您是否尝试在合并之前使用 row_number?
from pyspark.sql import SparkSession, functions as F
from pyspark.sql.window import Window
DF3 = DF1.unionAll(DF2)\
.withColumn("p", F.row_number().over(Window.orderBy(F.lit(None))))\
.coalesce(1)\
.orderBy(F.col("p"))\
.drop("p")
DF3.write.csv("/location")
- 我正在创建一个名为“p”的新列,并使用 row_number 和排序方式 None 为每一行分配一个增量编号(如果您想排序,可以使用任何列名通过该特定列)
- 合并后我们将行排序回初始顺序
- 在写入 csv 之前删除“p”列