PySpark when条件无法识别短字符串值问题排查及用法纠正
问题原因及解决方案
核心原因
短字符串匹配失败大概率是以下两种情况:
- 首尾存在空格:原数据中"DEP"、"BUY"这类短字符串可能带有前导/后导空格(比如
"DEP "或" BUY"),和你代码中硬编码的无空格字符串不匹配;而"DJOUR"、"DECBA"这类5字符值刚好没有空格,所以匹配成功。 - 大小写不统一:原数据中的值可能是小写(比如
"dep"),但代码中用的是大写"DEP",导致比较不相等。
排查验证
先执行以下代码确认实际数据情况:
df.select( "selling_type", trim(col("selling_type")).alias("trimmed_value"), lower(col("selling_type")).alias("lowercase_value") ).distinct().show(truncate=False)
查看selling_type的实际值和处理后的值是否和你代码中的匹配。
修正后的代码
方案1:处理首尾空格
如果是空格问题,给列值加上trim()后再匹配:
from pyspark.sql.functions import col, when, lit, trim df1 = df.withColumn("selling_type", when(trim(col("selling_type")) == "BUY", lit("ABCDEF1")) .when(trim(col("selling_type")) == "CJOUR", lit("ABCDEF2")) .when(trim(col("selling_type")) == "DEP", lit("ABCDEF3")) .when(trim(col("selling_type")) == "DIV", lit("ABCDEF4")) .when(trim(col("selling_type")) == "DJOUR", lit("ABCDEF5")) .when(trim(col("selling_type")) == "DECBA", lit("ABCDEF6")) .when(trim(col("selling_type")) == "MFEE", lit("ABCDEF7")) .when(trim(col("selling_type")) == "SELL", lit("ABCDEF8")) .when(trim(col("selling_type")) == "TEFRA", lit("ABCDEF9")) .when(trim(col("selling_type")) == "WITH", lit("ABCDEF10")) .otherwise(col("selling_type")) )
方案2:统一大小写
如果是大小写问题,将列值和匹配值统一为小写(或大写)后比较:
from pyspark.sql.functions import col, when, lit, lower df1 = df.withColumn("selling_type", when(lower(col("selling_type")) == "buy", lit("ABCDEF1")) .when(lower(col("selling_type")) == "cjour", lit("ABCDEF2")) .when(lower(col("selling_type")) == "dep", lit("ABCDEF3")) .when(lower(col("selling_type")) == "div", lit("ABCDEF4")) .when(lower(col("selling_type")) == "djour", lit("ABCDEF5")) .when(lower(col("selling_type")) == "decba", lit("ABCDEF6")) .when(lower(col("selling_type")) == "mfee", lit("ABCDEF7")) .when(lower(col("selling_type")) == "sell", lit("ABCDEF8")) .when(lower(col("selling_type")) == "tefra", lit("ABCDEF9")) .when(lower(col("selling_type")) == "with", lit("ABCDEF10")) .otherwise(col("selling_type")) )
方案3:更简洁的映射写法
如果映射关系固定,也可以用create_map+coalesce来简化代码,可读性更高:
from pyspark.sql.functions import col, lit, create_map, coalesce mapping = create_map( lit("BUY"), lit("ABCDEF1"), lit("CJOUR"), lit("ABCDEF2"), lit("DEP"), lit("ABCDEF3"), lit("DIV"), lit("ABCDEF4"), lit("DJOUR"), lit("ABCDEF5"), lit("DECBA"), lit("ABCDEF6"), lit("MFEE"), lit("ABCDEF7"), lit("SELL"), lit("ABCDEF8"), lit("TEFRA"), lit("ABCDEF9"), lit("WITH"), lit("ABCDEF10") ) # 如果需要处理空格或大小写,先转换列值再映射 df1 = df.withColumn("selling_type", coalesce(mapping[trim(col("selling_type"))], col("selling_type")))
内容的提问来源于stack exchange,提问作者Sampath
相关产品推荐
相关产品推荐

