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
相关产品推荐
相关产品推荐

