使用 Pyspark 替换结构类型列的空值

Replace Nulls of Struct type column using Pyspark

我有一个用例,我想用空值替换 StructType 列中的空值。 以下是您可以用来重新创建场景的示例:

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

data = [(1, [1, "Aman"]), (2, [2, "Raman"]), (3, [3, "Baman"]), (4, None)]

schema = StructType(
    [
        StructField("ID", IntegerType(), True),
        StructField(
            "Name",
            StructType(
                [
                    StructField("NameID", IntegerType(), True),
                    StructField("FirstName", StringType(), True),
                ]
            ),
            True,
        ),
    ]
)

df = spark.createDataFrame(data, schema)

df.show()

我想知道如何替换 Name 列中的空值。

使用 when 表达式:

from pyspark.sql import functions as F

df1 = df.withColumn(
    "Name",
    F.when(
        F.col("Name").isNull(),
        F.struct(
            F.lit(None).alias("NameID"), #replace None by default ID value if needed
            F.lit("").alias("FirstName")
        )
    ).otherwise(F.col("Name"))
)

df1.show()
#+---+----------+
#| ID|      Name|
#+---+----------+
#|  1| {1, Aman}|
#|  2|{2, Raman}|
#|  3|{3, Baman}|
#|  4|  {null, }|
#+---+----------+

这里是 coalesce 的解决方案:

from pyspark.sql import functions as F

df1 = df.withColumn(
    "Name",
    F.coalesce(
        F.col("Name"),
        F.struct(
            F.lit(None).alias("NameID"),
            F.lit("").alias("FirstName"),
        ),
    ),
)