在 PySpark 数据框中添加可为空的列

Posted

技术标签:

【中文标题】在 PySpark 数据框中添加可为空的列【英文标题】:Adding a nullable column in PySpark dataframe 【发布时间】:2021-07-29 14:56:58 【问题描述】:

在 Spark 中,文字列在添加时不能为空:

from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()

df = spark.createDataFrame([(1,)], ['c1'])

df = df.withColumn('c2', F.lit('a'))

df.printSchema()
#  root
#   |-- c1: long (nullable = true)
#   |-- c2: string (nullable = false)

如何创建可以为空的列?

【问题讨论】:

真正的问题是“为什么你需要一个点亮的空列... 就我而言,我需要创建与另一个数据框相同的架构,但其中包含不同的数据。这包括可空性。 那你为什么不直接创建一个模式呢?从 df.schema 开始。 我认为您应该使用原始用例创建另一个问题。目前,您正在尝试为您想象的解决方案寻求帮助,但可能不是正确的解决方案。它被称为XY_problem 抱歉,如果您无法想象一个用例,并不意味着它不存在。我遇到了这个问题并找到了答案here。然后我做得更好,所以我决定把它贴在这里。后来我阅读了更多内容,发现this highly-upvoted answer 解决了另一个问题。我认为这些案例证明了用例存在,无论人们可能遇到什么原始问题。我只是想帮助别人更容易找到答案。 【参考方案1】:

我发现的最短方法 - 使用 when(似乎不需要 otherwise 子句):

df = df.withColumn('c2', F.when(F.lit(1).isNotNull(), F.lit('a')))

完整测试结果:

from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.getOrCreate()

df = spark.createDataFrame([(1,)], ['c1'])
df = df.withColumn('c2', F.when(F.lit(1).isNotNull(), F.lit('a')))

df.show()
#  +---+---+
#  | c1| c2|
#  +---+---+
#  |  1|  a|
#  +---+---+

df.printSchema()
#  root
#   |-- c1: long (nullable = true)
#   |-- c2: string (nullable = true)

【讨论】:

以上是关于在 PySpark 数据框中添加可为空的列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 可为空的 uuid 类型 uuid 但表达式的类型为字符变化

代码首先为必填字段生成可为空的列

如何阻止 EF Core 在可为空的列上创建筛选索引

如何使用可为空的列连接 MySQL 表?

在 clickhouse 中,使用强制转换函数时如何为可为空的列返回 null

将可为空的列作为参数传递给 Spark SQL UDF