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

PySpark中如何从字符串列按分隔符提取指定子串?

PySpark提取分隔符间子串的解决方案

原始DataFrame

from pyspark.sql import SparkSession
import pyspark.sql.functions as f

spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame(
[
('14|100|00|123|567','A',25),
('13|200|20|323|467','B',24),
('15|300|30|223|667','A',20)],("rust", "name", "value"))

需求

  • 提取rust列第1个与第2个|之间的子串,命名为second_string
  • 提取rust列第2个与第3个|之间的子串,命名为third_string
  • 提取rust列第3个|之后的所有内容,命名为last_string

方法一:嵌套使用substring_index

利用substring_index的截取特性,先定位到目标分隔符区间,再反向提取子串:

df_result = df.select(
    "rust", "name", "value",
    # 取第1-2个|之间的内容:先截前2个|的部分,再从右取1个|的内容
    f.substring_index(f.substring_index(df.rust, '|', 2), '|', -1).alias("second_string"),
    # 取第2-3个|之间的内容:先截前3个|的部分,再从右取1个|的内容
    f.substring_index(f.substring_index(df.rust, '|', 3), '|', -1).alias("third_string"),
    # 取第3个|之后的内容:从右反向截取-3个|的部分
    f.substring_index(df.rust, '|', -3).alias("last_string")
)

df_result.show()

执行结果:

+-----------------+----+-----+-------------+------------+-----------+
|             rust|name|value|second_string|third_string|last_string|
+-----------------+----+-----+-------------+------------+-----------+
|14|100|00|123|567|   A|   25|          100|          00|    123|567|
|13|200|20|323|467|   B|   24|          200|          20|    323|467|
|15|300|30|223|667|   A|   20|          300|          30|    223|667|
+-----------------+----+-----+-------------+------------+-----------+

方法二:使用split拆分数组后提取

将rust列按|拆分为数组,通过索引提取目标元素,再拼接后续内容:

df_result = df.select(
    "rust", "name", "value",
    # 数组索引1对应第1-2个|之间的内容
    f.split(df.rust, '\\|')[1].alias("second_string"),
    # 数组索引2对应第2-3个|之间的内容
    f.split(df.rust, '\\|')[2].alias("third_string"),
    # 从数组索引3开始取所有元素,用|拼接成原格式
    f.concat_ws('|', f.slice(f.split(df.rust, '\\|'), 3, -1)).alias("last_string")
)

df_result.show()

注意:split函数中|是正则特殊字符,需要用\\|转义

执行结果与方法一完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:06:24