我正在構建一個存盤庫來測驗資料串列,并且打算在陣列型別的單個列中收集錯誤。因此,我先創建列,然后執行每個測驗,如果測驗失敗,我會在專用列中添加錯誤訊息。
我擔心的是當我添加第一個值時:我仍然有一個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")))
),
),
)
但結果完全一樣。
任何想法來管理這個?我應該采取不同的方式嗎?
uj5u.com熱心網友回復:
試試這個:
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首先使用空值創建列,然后使用合并函式
或者,如果您愿意,可以像這樣從末尾的列中洗掉null值:errors
.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)")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/427402.html
