Можно преобразовать в pandas DataFrame, вычислить сумму, а затем обратно в Spark DataFrame (но я не рекомендую это). Обратите внимание на следующие работы, потому что pandas.Dataframe.sum
по умолчанию skipna=True
# Generate data
data = [(1, 50, None, 0), (1, 0, 100, 0), (1, 0, 0, 125), (2, 75, 0, 0)]
countries = spark.createDataFrame(data, ["id", "US", "UK", "Can"])
columns = ['US', 'UK', 'Can']
# Solution
pd_countries = countries.toPandas()
pd_countries['sum'] = pd_countries[columns].sum(axis=1) # default is ignore nan
result = spark.createDataFrame(pd_countries)
result.show()
+---+---+-----+---+-----+
| id| US| UK|Can| sum|
+---+---+-----+---+-----+
| 1| 50| NaN| 0| 50.0|
| 1| 0|100.0| 0|100.0|
| 1| 0| 0.0|125|125.0|
| 2| 75| 0.0| 0| 75.0|
+---+---+-----+---+-----+
Также обратите внимание, что ваш оригинальный код выполняет следующую операцию
sum(countries[c] for c in columns)
# Column<b'(((US + 0) + UK) + Can)'>
# equivalent to (col(US) + 0 + col(UK) + col(Can))
На мой взгляд, самый простой способ должен использовать na.fill(0)
как предложено комментатором и ответом, а затем вычислить сумму.