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

PySpark技术问询:如何从字符串提取多个数字序列至独立新列

Spark提取字符串中多组数字到不同列的解决方案

一、已知数字序列数量时,直接提取到对应列

首先纠正你代码中的错误:F.df 是无效函数,正确的Spark函数是 F.regexp_extract。要提取第N组数字,需要调整正则表达式和捕获组索引:

示例代码

from pyspark.sql import functions as F

# 提取第1组数字
df = df.withColumn('IDENT1', F.regexp_extract('IDENTIFIER', r'(?:\D*(\d+)){1}', 1))
# 提取第2组数字
df = df.withColumn('IDENT2', F.regexp_extract('IDENTIFIER', r'(?:\D*(\d+)){2}', 1))
# 如需更多列,继续添加,把{2}改成{3}、{4}即可

正则说明

  • \D*:匹配任意非数字字符(包括0个)
  • (?:...):非捕获组,用于重复匹配逻辑但不捕获内容
  • (\d+):捕获数字序列的核心捕获组
  • {N}:表示重复匹配N次,最终捕获第N个数字序列

运行结果

IDENTIFIERIDENT1IDENT2
31010833 - 9911075145 - 更多随机文本310108339911075145
TL/9910900047/asdiqwoidw/更多文本// 23231263264991090004723231263264

二、不确定数字序列数量时,先转数组再拆分列

如果无法提前知道字符串中数字序列的最大数量,可以先把所有数字提取成数组,再拆分到不同列:

示例代码

from pyspark.sql import functions as F

# 1. 把所有非数字字符替换成逗号,再拆分得到数字数组(过滤空值)
df = df.withColumn(
    'IDENT_ARRAY',
    F.expr("filter(split(regexp_replace(IDENTIFIER, '[^\\d]+', ','), ','), x -> x != '')")
)

# 2. 根据数组长度生成对应列(示例最多取3列,可按需扩展)
df = df.withColumn('IDENT1', F.element_at('IDENT_ARRAY', 1))
df = df.withColumn('IDENT2', F.element_at('IDENT_ARRAY', 2))
df = df.withColumn('IDENT3', F.element_at('IDENT_ARRAY', 3))

说明

  • regexp_replace(IDENTIFIER, '[^\\d]+', ','):将所有连续非数字字符替换为单个逗号
  • split(..., ','):按逗号拆分得到包含数字和空串的数组
  • filter(..., x -> x != ''):过滤掉数组中的空串(避免开头/结尾非数字导致的空元素)
  • element_at(IDENT_ARRAY, N):取数组中第N个元素,没有则返回null

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:03:35