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个数字序列
运行结果
| IDENTIFIER | IDENT1 | IDENT2 |
|---|---|---|
| 31010833 - 9911075145 - 更多随机文本 | 31010833 | 9911075145 |
| TL/9910900047/asdiqwoidw/更多文本// 23231263264 | 9910900047 | 23231263264 |
二、不确定数字序列数量时,先转数组再拆分列
如果无法提前知道字符串中数字序列的最大数量,可以先把所有数字提取成数组,再拆分到不同列:
示例代码
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
相关产品推荐
相关产品推荐

