Spark DataFrame中使用正则匹配null值的问题解决
Spark DataFrame Null值处理问题
现有DataFrame
spark_df.show() # Output # +----+----+ # |keys|vals| # +----+----+ # | k1| 0| # | k2| 1| # | k3|null| # +----+----+
现有函数实现
def add_col_by_vals(): df_with_col = spark_df.withColumn('target_col', get_column()) return df_with_col def get_column(): return ~f.lower(f.col("vals")).rlike("0|null|None")
预期结果
df_after_add_col = add_col_by_vals() df_after_add_col.show() # Output # +----+----+----------+ # |keys|vals|target_col| # +----+----+----------+ # | k1| 0| false| # | k2| 1| true| # | k3|null| false| # +----+----+----------+
实际执行结果
df_after_add_col = add_col_by_vals() df_after_add_col.show() # Output # +----+----+----------+ # |keys|vals|target_col| # +----+----+----------+ # | k1| 0| false| # | k2| 1| true| # | k3|null| null| # +----+----+----------+
限制条件
仅允许修改get_column函数,完全不能修改原始DataFrame。
解决方案
问题根源在于:当vals为null时,f.lower(f.col("vals"))返回null,后续的rlike操作结果也为null,取反后仍然是null,无法得到预期的false。
方法一:用coalesce处理null值
将null值替换为字符串"null",确保rlike能匹配到规则,取反后得到false:
def get_column(): return ~f.coalesce(f.lower(f.col("vals")), f.lit("null")).rlike("0|null|None")
方法二:用when/otherwise显式分支处理
直接判断null值并返回false,非null值走原逻辑:
def get_column(): return f.when(f.col("vals").isNull(), f.lit(False)) \ .otherwise(~f.lower(f.col("vals")).rlike("0|null|None"))
两种方法都能让null对应的target_col返回false,符合预期结果。
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

