PySpark如何提取Spark DataFrame列中两个指定标记间的字符串
PySpark 提取指定标记间字符串实现方案
优先推荐使用Spark内置正则提取函数实现,无需自定义UDF,性能最优,代码简洁。
方法1:正则提取(推荐)
使用regexp_extract函数通过正则捕获两个标记间的内容,对字符串格式兼容性最好,不受cd7字段值长度变化影响。
from pyspark.sql import functions as F df_result = df.withColumn( "cd_7", # 正则含义:匹配cd7=后、&cd21前的所有非&字符,取第1个捕获组结果 F.regexp_extract("c_1", r"cd7=([^&]+)&cd21", 1) )
正则说明:
[^&]+表示匹配任意数量的非&字符,避免因为cd7值长度变化、其他字段位置变动导致匹配错误。
方法2:字符串位置切分
如果不想使用正则,也可以通过计算两个标记的位置做字符串截取,逻辑直观。
from pyspark.sql import functions as F df_result = df.withColumn( "cd_7", F.substring( str=F.col("c_1"), pos=F.instr("c_1", "cd7=") + 4, # 跳过"cd7="共4个字符的长度 len=F.instr("c_1", "&cd21") - (F.instr("c_1", "cd7=") + 4) ) )
异常场景兜底
如果存在部分行的c_1字段缺失cd7=或&cd21标记,可以加判断逻辑返回null或自定义默认值,避免返回无效内容:
from pyspark.sql import functions as F df_result = df.withColumn( "cd_7", F.when( F.col("c_1").rlike(r"cd7=[^&]+&cd21"), F.regexp_extract("c_1", r"cd7=([^&]+)&cd21", 1) ).otherwise(None) # 匹配失败返回null,可按需替换为默认值 )
执行df_result.show()后即可得到预期结果:
| tstamp | c_1 | cd_7 |
|---|---|---|
| 2022-06-15 10:00:00 | xxx&cd7=H10S10P10&cd21=GA&cd3=6... | H10S10P10 |
| 2022-06-15 10:10:01 | xz&cd7=H11S11P11&cd21=CA&cd3=5... | H11S11P11 |
内容的提问来源于stack exchange,提问作者Crubal Chenxi Li
相关产品推荐
相关产品推荐

