pySpark:将值添加到没有 'null' 的空数组

pySpark : add value to an empty array without 'null'

我正在构建一个存储库来测试数据列表,我打算在数组类型的单个列中收集错误。因此,我先创建列,然后执行每个测试,如果失败,我会在专用列中添加错误消息。

我担心的是当我添加第一个值时:我仍然有一个 null 值,我无法设法避免或删除它。

这是我试过的一些代码。
第一个版本:我期望的基本方式:

df = df.withColumn("errors", F.array(F.lit(None)))

df = df.withColumn(
    "errors",
    F.when(
        ((F.col("col1").isNull()) | ~(F.col("col1").rlike(r"\b[A-Z]{3,3}"))),
        F.array_union(F.col("errors"), F.array(F.lit("col1 is not valid"))),
    ),
)

出现错误时的结果:[null, col1 is not valid]

我试图检查数组中是否已经有一些值:

df = df.withColumn("errors", F.array(F.lit(None)))

df = df.withColumn(
    "errors",
    F.when(
        ((F.col("col1").isNull()) | ~(F.col("col1").rlike(r"\b[A-Z]{3,3}"))),
        F.when(
            F.size(F.col("errors")) == -1, F.array(F.lit("col1 is not valid"))
        ).otherwise(
            F.array_union(F.col("errors"), F.array(F.lit("col1 is not valid")))
        ),
    ),
)

但结果完全一样

有管理这个的想法吗?我应该换一种方式吗?

试试这个:

df = df.withColumn("errors", F.lit(None).cast("array<string>"))

df = df.withColumn(
    "errors",
    F.when(
        F.col('col1').isNull() | ~F.col('col1').rlike(r'\b[A-Z]{3,3}'),
        F.coalesce(
            F.concat(F.col("errors"), F.array(F.lit("col1 is not valid"))),
            F.array(F.lit("col1 is not valid"))
        )
    )
)

errors 列首先用空值创建,然后使用合并函数


或者,如果您愿意,可以从末尾的 errors 列中删除 null 值,如下所示:

.withColumn(
    "errors",
    F.array_except("errors", F.array(F.lit(None)))
)

# or using filter
.withColumn(
    "errors",
    F.expr("filter(errors, x -> x is not null)")
)