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

Posted

技术标签:

【中文标题】Spark数据框不添加具有空值的列【英文标题】:Spark dataframe not adding columns with null values 【发布时间】:2018-10-18 01:47:47 【问题描述】:

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

原始数据框

╔══════╦══════╗
║ 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    ║
╚══════╩══════╩══════╝

有没有办法将空值合并到计算中。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

您可以合并为 0 以获得总和。 对于两列都为空的情况,您可以使用条件函数。

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这会在将 2 个空值相加时添加输出 0,例如。 null+null = 0。有没有办法使输出为空,例如。空+空=空 case when添加条件:df.selectExpr('*', 'case when cola is null and colb is null then null else coalesce(cola, 0) + coalesce(colb, 0) end as colc') 我有一个 column_list 并且想要执行相同的操作。该怎么做?

以上是关于Spark数据框不添加具有空值的列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark/Scala 中查找具有许多空值的列

使用 Java 在 Spark Data Frame 中添加空值列

如何在 Spark 数据框中添加具有序列值的列?

如何将具有值的列添加到 Spark Java 中的新数据集?

如何在 Postgresql 数据库中添加不允许空值的列?

Impala 添加具有默认值的列