我有两个数据框,
DF1
+----+-------+------+------+
|id | pnl |value2|value3|
+----+-------+------+------+
| 1 |10 |20 |30 |
| 2 |20 |30 |40 |
| 3 |30 |40 |50 |
+----+-------+------+------+
DF2
+----+-------+------+------+
|id | pnl |value2|value3|
+----+-------+------+------+
| 1 |100 |200 |300 |
| 2 |200 |300 |400 |
| 3 |300 |400 |500 |
+----+-------+------+------+
我正在尝试通过id合并这两个数据帧并将值列添加在一起。所以得到这样的东西。
+----+-------+------+------+
|id | pnl |value2|value3|
+----+-------+------+------+
| 1 |100+10 |200+20|300+30|
| 2 |200+20 |300+30|400+40|
| 3 |300+30 |400+40|500+50|
+----+-------+------+------+
这在我使用时效果很好
// extract the names of the columns to sum
val cols = df1.columns.filter(_!="id")
// join and sum
val result = df1
.join(df2,Seq("id"), "full_outer")
.select( col("id") +: cols.map(c=>df1(c)+df2(c) as c) : _*)
但是当其中一个数据帧中缺少一个ID时。例如
DF1
+----+-------+------+------+
|id | pnl |value2|value3|
+----+-------+------+------+
| 1 |10 |20 |30 |
| 2 |20 |30 |40 |
| 3 |30 |40 |50 |
| 4 |40 |40 |40
+----+-------+------+------+
DF2
+----+-------+------+------+
|id | pnl |value2|value3|
+----+-------+------+------+
| 1 |100 |200 |300 |
| 2 |200 |300 |400 |
| 3 |300 |400 |500 |
+----+-------+------+------+
使用上面提到的操作合并后,得到以下值。
+----+-------+------+------+
|id | pnl |value2|value3|
+----+-------+------+------+
| 1 |100+10 |200+20|300+30|
| 2 |200+20 |300+30|400+40|
| 3 |300+30 |400+40|500+50|
| 4 |null |null |null |
+----+-------+------+------+
我知道我得到这个是因为df2中没有该ID。因此,我想解决此问题的一种方法是在合并后使用.na.fill(0.0)
// join and sum
val result = df1
.join(df2,Seq("id"), "full_outer").na.fill(0.0)
.select( col("id") +: cols.map(c=>df1(c)+df2(c) as c) : _*)
但是spark似乎不喜欢这样,并且出现以下错误。
org.apache.spark.sql.AnalysisException:引用'pnl'不明确,可能是:pnl,pnl。;
有人知道解决方法吗?谢谢
答案 0 :(得分:0)
您可以使用