You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()后即可得到预期结果:

tstampc_1cd_7
2022-06-15 10:00:00xxx&cd7=H10S10P10&cd21=GA&cd3=6...H10S10P10
2022-06-15 10:10:01xz&cd7=H11S11P11&cd21=CA&cd3=5...H11S11P11

内容的提问来源于stack exchange,提问作者Crubal Chenxi Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:36:18