У меня есть два кадра данных,
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) : _*)
Но когда один идентификатор отсутствует в одном из кадров данных. Например
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. Итак, один из способов решить эту проблему - использовать .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) : _*)
Но искра, похоже, не нравится, и я получаю следующую ошибку.
org.apache.spark.sql.AnalysisException: ссылка 'pnl' неоднозначна, может быть: pnl, pnl.;
Кто-нибудь знает обходной путь для этого? Спасибо