Spark SQL будет суммировать null
как ноль, поэтому, если вы знаете, что нет никаких «перекрывающихся» элементов данных, просто сгруппируйте по столбцу, к которому вы будете sh агрегировать, и суммируйте.
Предполагая, что что вы хотите сохранить исходные имена столбцов (а не суммировать столбец id
), вам нужно указать столбцы, которые суммируются, а затем переименовать их после агрегации.
before.show()
+---+------+------+------+
| id|count1|count2|count3|
+---+------+------+------+
| 1| null| 1| null|
| 1| 3| null| null|
| 1| null| null| 5|
| 2| null| 1| null|
| 2| 1| null| null|
| 2| null| null| 2|
+---+------+------+------+
after = before
.groupby('id').sum(*[c for c in before.columns if c != 'id'])
.select([col(f"sum({c})").alias(c) for c in before.columns if c != 'id'])
after.show()
+------+------+------+
|count1|count2|count3|
+------+------+------+
| 3| 1| 5|
| 1| 1| 2|
+------+------+------+