Spark数据框未添加具有空值的列

时间:2018-10-18 01:47:47

标签: python apache-spark pyspark

我正在尝试通过在数据框中添加两个现有列来创建新列。

原始数据框

╔══════╦══════╗
║ cola ║ colb ║
╠══════╬══════╣
║ 1    ║ 1    ║
║ null ║ 3    ║
║ 2    ║ null ║
║ 4    ║ 2    ║
╚══════╩══════╝

带有派生列的预期输出

╔══════╦══════╦══════╗
║ cola ║ colb ║ colc ║
╠══════╬══════╬══════╣
║ 1    ║ 1    ║    2 ║
║ null ║ 3    ║    3 ║
║ 2    ║ null ║    2 ║
║ 4    ║ 2    ║    6 ║
╚══════╩══════╩══════╝

当我使用df = df.withColumn('colc',df.cola + df.colb)时,它不会添加具有空值的列。

我得到的输出是:

╔══════╦══════╦══════╗
║ cola ║ colb ║ colc ║
╠══════╬══════╬══════╣
║ 1    ║ 1    ║ 2    ║
║ null ║ 3    ║ null ║
║ 2    ║ null ║ null ║
║ 4    ║ 2    ║ 6    ║
╚══════╩══════╩══════╝

是否有任何方法可以将空值合并到计算中。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

使用null函数将0替换为coalesce,然后将两列加在一起;使用selectExpr和sql语法:

df.selectExpr('*', 'coalesce(cola, 0) + coalesce(colb, 0) as colc')

答案 1 :(得分:1)

您可以批发到0以获取总和。 对于两列均为空的情况,可以使用条件函数。

对于您的情况,代码应类似于

df.selectExpr('*', 'if(isnull(cola) and isnull(colb), null, coalesce(cola, 0) + coalesce(colb, 0)) as colc')