按字符位置拆分DataFrame列:实现指定区间字符截取需求
解决方案
一、实现目标结构的正确逗号拆分方式
你之前的代码问题在于F.split默认会拆分所有逗号,导致HELLO,WORLD被拆成两个元素,只取[2]自然拿不到完整的c列。可以通过限制拆分次数来解决:
from pyspark.sql import functions as F # 先按逗号拆分2次,得到[a的内容, 剩余部分] df = df.withColumn('split_first', F.split(df['Val'], ',', 2)) # 提取a列,去除前后空格 df = df.withColumn('a', F.trim(F.col('split_first')[0])) # 对剩余部分再次按逗号拆分2次,得到[b的内容, c的内容] df = df.withColumn('split_second', F.split(F.col('split_first')[1], ',', 2)) # 提取b和c列,去除前后空格 df = df.withColumn('b', F.trim(F.col('split_second')[0])) df = df.withColumn('c', F.trim(F.col('split_second')[1])) # 清理临时列 df = df.drop('split_first', 'split_second')
执行后可得到目标结构:
| a | b | c |
|---|---|---|
| 1 | M A | HELLO,WORLD |
| 2 | M 1A | HELLO WORLD |
二、按字符位置拆分的实现
如果确实需要按**字符位置(从1开始计数)**拆分:
- a列取第1位字符
- b列取第2到第5位字符
- c列取第5位之后的所有字符
可以用substring函数实现:
from pyspark.sql import functions as F df = df.withColumn('a', F.substring(df['Val'], 1, 1)) df = df.withColumn('b', F.trim(F.substring(df['Val'], 2, 4))) # 从第2位开始取4个字符,对应2-5位 df = df.withColumn('c', F.trim(F.substring(df['Val'], 6, 1000))) # 从第6位开始取剩余所有内容
注意:这种方式依赖原始字符串的字符位置固定,若原始数据格式变动(比如a列不是单字符),结果会不符合预期,因此更推荐第一种按分隔符限制拆分次数的方案。
内容的提问来源于stack exchange,提问作者lunbox
相关产品推荐
相关产品推荐

