我正在尝试堆叠两个数据文件(使用unionByName()),然后删除重复条目(使用drop_duplicates())。我是否可以相信unionByName()将保持行的顺序,也就是说,df1.unionByName(df2)总是会生成第一个N行是df1的数据?因为,如果是这样的话,在应用drop_duplicates()时,df1的行将始终被保留,这就是我想要的行为。
发布于 2022-06-28 12:57:41
UnionByName不能保证您的记录将在df1和df2中排在第一位。这些都是分布式和并行的任务,所以您肯定不能在此基础上构建。
解决方案可能是在每个DataFrame中添加一个技术性的DataFrame列,然后是unionByName(),然后使用row_number()分析函数在这个ID中按priority排序,然后选择带有higher priority的一个(在下面的案例1中,表示大于2)。
看看下面的Scala代码:
val df1WithPriority = df1.withColumn("priority", lit(1))
val df2WithPriority = df2.withColumn("priority", lit(2))
df1WithPriority
.unionByName(df2WithPriority)
.withColumn(
"row_num",
row_number()
.over(Window.partitionBy("ID").orderBy(col("priority").asc)
)
.where(col("row_num") === lit(1))https://stackoverflow.com/questions/72785907
复制相似问题