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

如何在PySpark中从点分隔的字符串行提取指定文本?

PySpark提取字符串指定部分解决方案

输入数据

Submission ID
Dx.CS1.2023-21-01
DX.RE1.2023-12-01
DX.G1.2021-23-01
DX.G2.2022-10-12

期望输出

ID
CS1
RE1
G1
G2

解决方案

方法1:使用split函数分割字符串

利用字符串的分隔符特征(首行用空格分隔,其余行用.分隔),通过split函数结合when条件判断提取目标内容:

from pyspark.sql import SparkSession
from pyspark.sql.functions import split, when, col

spark = SparkSession.builder.appName("ExtractTargetText").getOrCreate()

# 构造输入DataFrame
data = [
    ("Submission ID",),
    ("Dx.CS1.2023-21-01",),
    ("DX.RE1.2023-12-01",),
    ("DX.G1.2021-23-01",),
    ("DX.G2.2022-10-12",)
]
df = spark.createDataFrame(data, ["input_str"])

# 提取目标文本
df = df.withColumn(
    "extracted_id",
    when(
        col("input_str").startswith("Submission"),
        split(col("input_str"), " ").getItem(1)
    ).otherwise(
        split(col("input_str"), "\\.").getItem(1)
    )
)

# 查看结果
df.select("extracted_id").show(truncate=False)

方法2:使用正则表达式提取

通过regexp_extract函数匹配通用规则,一次处理所有行:

from pyspark.sql import SparkSession
from pyspark.sql.functions import regexp_extract, col

spark = SparkSession.builder.appName("ExtractTargetText").getOrCreate()

# 构造输入DataFrame
data = [
    ("Submission ID",),
    ("Dx.CS1.2023-21-01",),
    ("DX.RE1.2023-12-01",),
    ("DX.G1.2021-23-01",),
    ("DX.G2.2022-10-12",)
]
df = spark.createDataFrame(data, ["input_str"])

# 正则表达式匹配:匹配首行空格后内容,或其余行两个点之间的内容
df = df.withColumn(
    "extracted_id",
    regexp_extract(col("input_str"), r"(?:Submission )?(\w+)(?:\.\d{4}-\d{2}-\d{2})?", 1)
)

# 查看结果
df.select("extracted_id").show(truncate=False)

正则说明:

  • (?:Submission )?:非捕获组,匹配可选的前缀"Submission "
  • (\w+):捕获组,提取字母数字组合的目标内容
  • (?:\.\d{4}-\d{2}-\d{2})?:非捕获组,匹配可选的日期后缀

内容的提问来源于stack exchange,提问作者Biplab1985

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:10:42