Scala:DataFrame.join仍在创建重复项
我有两个scala数据帧。尽管遵循给出的例子,我仍然得到了重复的Scala:DataFrame.join仍在创建重复项,scala,apache-spark,Scala,Apache Spark,我有两个scala数据帧。尽管遵循给出的例子,我仍然得到了重复的 +----+----+----+-------+ | b1| b2| b3|$$RowId| +----+----+----+-------+ |a1-1|a2-1|a3-1| 1| |a1-2|a2-2|a3-2| 2| |a1-3|a2-3|a3-3| 3| |null|null|null| 8| |null|null|null| 9|
+----+----+----+-------+
| b1| b2| b3|$$RowId|
+----+----+----+-------+
|a1-1|a2-1|a3-1| 1|
|a1-2|a2-2|a3-2| 2|
|a1-3|a2-3|a3-3| 3|
|null|null|null| 8|
|null|null|null| 9|
|null|null|null| 10|
+----+----+----+-------+
+-------+-----+-----+-----+
|$$RowId| b1| b2| b3|
+-------+-----+-----+-----+
| 1| null| null| null|
| 2| null| null| null|
| 3| null| null| null|
| 8| b1-8| b2-8|b3-15|
| 9| b1-9| b2-9|b3-17|
| 10|b1-10|b2-10|b3-19|
+-------+-----+-----+-----+
我想把数据合并成一个数据帧。我使用join如下:
val finalDF = colsToShiftRenamedDF.join(colsToKeepDF, Seq("$$RowId"))
结果是以下数据帧
+-------+----+----+----+-----+-----+-----+
|$$RowId| b1| b2| b3| b1| b2| b3|
+-------+----+----+----+-----+-----+-----+
| 1|a1-1|a2-1|a3-1| null| null| null|
| 2|a1-2|a2-2|a3-2| null| null| null|
| 3|a1-3|a2-3|a3-3| null| null| null|
| 8|null|null|null| b1-8| b2-8|b3-15|
| 9|null|null|null| b1-9| b2-9|b3-17|
| 10|null|null|null|b1-10|b2-10|b3-19|
+-------+----+----+----+-----+-----+-----+
任何建议您加入的方式肯定会为您提供每个
表
的列
,即使它们是空的
如果不需要副本,则应添加一些附加步骤。
import org.apache.spark.sql.functions._
val finalDF = colsToShiftRenamedDF.as("t1").join(colsToKeepDF.as("t2"), Seq("$$RowId"))
.select(col("$$RowId"),
when(col("t1.b1").isNull || col("t1.b1") === "null", col("t2.b1")).otherwise(col("t1.b1")).as("b1"),
when(col("t1.b2").isNull || col("t1.b2") === "null", col("t2.b2")).otherwise(col("t1.b2")).as("b2"),
when(col("t1.b3").isNull || col("t1.b3") === "null", col("t2.b3")).otherwise(col("t1.b3")).as("b3"))
这将为您提供输出dataframe
as
+-------+-----+-----+-----+
|$$RowId|b1 |b2 |b3 |
+-------+-----+-----+-----+
|1 |a1-1 |a2-1 |a3-1 |
|2 |a1-2 |a2-2 |a3-2 |
|3 |a1-3 |a2-3 |a3-3 |
|8 |b1-8 |b2-8 |b3-15|
|9 |b1-9 |b2-9 |b3-17|
|10 |b1-10|b2-10|b3-19|
+-------+-----+-----+-----+
我希望答案是有帮助的最后我提出了一些类似的想法,但我没有使用join,而是使用了with column,我怀疑这一点会更慢,因为这个过程一次只进行一列。万分感谢!!我的荣幸@Jake,感谢您的接受和投票Ramesh,只有在您可以腾出时间的情况下,才有可能根据要移位的列数(比如b1 bn和a1 an)(其中count bn==count an)使代码动态变化?如果是的话,也许可以作为额外的答案发布。我知道这要求很多,所以如果你很忙,请忽略。我已经感谢你的帮助了,我想这是可能的。如果以前没有人问过,你为什么不再问一个问题呢。如果不是我,其他人会回答。:)好的,我可以单独问一个问题