Как заменить нули в слиянии и добавить - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть два кадра данных,

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

Кто-нибудь знает обходной путь для этого? Спасибо

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете использовать cols.map(c => coalesce(df1(c), lit(0)) + coalesce(df2(c), lit(0)) as c)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...