如何在合并和添加中替换空值

时间:2019-04-04 15:23:02

标签: scala apache-spark dataframe merge

我有两个数据框,

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。;

有人知道解决方法吗?谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用