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)")
)
我正在构建一个存储库来测试数据列表,我打算在数组类型的单个列中收集错误。因此,我先创建列,然后执行每个测试,如果失败,我会在专用列中添加错误消息。
我担心的是当我添加第一个值时:我仍然有一个 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)")
)