Apache spark Spark:从另一列创建新列,但不可为null
我有一个简单的问题,但可以找到一个简单的解决办法 我注意到以下几点:Apache spark Spark:从另一列创建新列,但不可为null,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个简单的问题,但可以找到一个简单的解决办法 我注意到以下几点: myDF.withColumn("newColumn", col("aNullableColumn")) 然后在模式中,newColumn变为可空,即使aNullableColumn中没有空值 如何使newColumn不可为空 我在谷歌上搜索了一下,找到的唯一解决方案是重写架构并重新创建数据帧,但这不是一个好的解决方案。如果您完全确定您的列没有null值,您可以这样做来更改新列的nullability属性: from pys
myDF.withColumn("newColumn", col("aNullableColumn"))
然后在模式中,newColumn
变为可空,即使aNullableColumn
中没有空值
如何使newColumn
不可为空
我在谷歌上搜索了一下,找到的唯一解决方案是重写架构并重新创建数据帧,但这不是一个好的解决方案。如果您完全确定您的列没有
null
值,您可以这样做来更改新列的nullability属性:
from pyspark.sql.functions import col, lit, coalesce
myDF.withColumn("newColumn", coalesce(col("aNullableColumn"), lit(0)))
并确保在lit
函数中使用正确的数据类型(与anAllableColumn
的数据类型相同)。还要注意,如果存在null
值,则coalesce
函数会将其更改为您在lit
中提供的值
之所以这样做,是因为coalesce
处理nullable
属性的方式。这直接取自Spark源代码:
如果联合的所有子项都可为空,或者如果它没有子项,则联合是可为空的
这里的第二个子项是
lit(0)
,它不可null
,因此结果列也不可null
。您的最终目标是什么?Spark不会强制执行它。字段newColumn
被设置为不可为空,我想保持它不可为空(因为它是强制的)。当我更改它的值时,我不希望它的可空属性更改。我还测试了when(col(“aNullableColumn”).isnull,46)。否则(col(“aNullableColumn”)),但它仍然可以为null