PySpark中同一DataFrame内两个字符串列相减的最佳实践是什么?
PySpark没有为字符串类型重载-运算符,所以直接对两个字符串列做减法只会返回空值,这个是预期行为。你要实现的字符串列相减本质是把A列的内容从data列的对应位置移除,结合你的示例场景是后缀匹配移除,推荐两种生产环境常用的实现方案:
方案1:正则替换(通用场景,适配灵活匹配规则)
适合匹配规则不固定、可能需要调整匹配位置的场景,需要先转义URL里的正则特殊字符避免匹配失效:
from pyspark.sql.functions import col, regexp_replace, when, lit, concat # 转义正则元字符的通用表达式 escape_regex_meta = regexp_replace(col("A"), r"([.*+?^${}()|\[\]\\])", r"\\$1") sdf1 = sdf.withColumn( "Expected_column", # A列为空/NaN时直接返回原data列 when(col("A").isNull() | (col("A") == "NaN"), col("data")) # 否则替换掉data末尾匹配A列的内容 .otherwise(regexp_replace(col("data"), concat(escape_regex_meta, lit("$")), "")) )
方案2:字符串截取(大数据量场景性能最优)
如果确定是精确的后缀移除,用字符串长度截取的方式比正则少了匹配计算,性能高30%以上,适合TB级以上数据量的作业:
from pyspark.sql.functions import col, length, when, substring sdf1 = sdf.withColumn( "Expected_column", when(col("A").isNull() | (col("A") == "NaN"), col("data")) .otherwise(substring(col("data"), 1, length(col("data")) - length(col("A")))) )
两种方案都可以完美输出你示例中的预期结果。
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

