首页 > 解决方案 > Spark:从另一个创建新列但不能为空

问题描述

我有一个简单的问题,但可以找到一个简单的解决方案。

我注意到以下内容:

myDF.withColumn("newColumn", col("aNullableColumn"))

然后在模式newColumn中变为可为空,即使aNullableColumn.

如何获得newColumn不可为空?

我用谷歌搜索了一下,我发现的唯一解决方案是重写架构并重新创建数据框,但这不是很好的解决方案。

标签: apache-sparkapache-spark-sql

解决方案


如果您绝对确定您的列没有null值,您可以这样做来更改新列的可空性属性:

from pyspark.sql.functions import col, lit, coalesce

myDF.withColumn("newColumn", coalesce(col("aNullableColumn"), lit(0)))

并确保在lit函数内使用正确的数据类型(与您的数据类型相同aNullableColumn)。另请注意,如果有null值,该coalesce函数会将其更改为您在内部提供的值lit

这样做的原因是coalesce处理nullable财产的方式。这直接取自 Spark 源代码:

如果 Coalesce 的所有子代都可以为空,或者它没有子代,则它可以为空。

这里是第二个孩子lit(0),这不是nullable,因此结果列也不nullable是。


推荐阅读