PySpark字符串列通过负索引提取末尾多个字符的问题
解决PySpark DataFrame提取字符串末尾N个字符的问题
你遇到的问题其实是因为PySpark的substring函数和Python原生字符串的索引规则不一样——它不支持负的起始位置(采用1-based索引而非0-based,且不接受负数参数),所以你用-1作为起始参数的写法不会得到想要的结果。
给你几个简单的解决方案,优先推荐最直观的那个:
方法1:使用right函数(最简洁)
PySpark提供了right函数,专门用来提取字符串右侧指定长度的字符,完全匹配你的需求:
from pyspark.sql.functions import right # 提取number列最后3个字符,并给结果列起别名 result_df = df.select( right(df['number'], 3).alias('last_three_digits'), 'event_type' ) result_df.show()
运行后会得到:
+----------------+----------+ |last_three_digits|event_type| +----------------+----------+ | 022| 11| | 715| 11| +----------------+----------+
方法2:结合substring和length函数
如果不想用right,也可以通过计算字符串长度来确定substring的起始位置(因为substring是1-based索引,要取最后3个字符,起始位置就是长度 - 3 + 1 = 长度 - 2):
from pyspark.sql.functions import substring, length result_df = df.select( substring(df['number'], length(df['number']) - 2, 3).alias('last_three_digits'), 'event_type' ) result_df.show()
这个方法的逻辑是先获取number列的总长度,再推导起始位置,效果和方法1完全一致。
为什么你的原代码不行?
PySpark的substring(col, start, length)函数中:
start是1-based的起始索引,必须是正整数- 你传入的
-1会被当作无效参数,实际会从字符串的第1位开始取3个字符,这显然不是你想要的结果。
内容的提问来源于stack exchange,提问作者akilat90
相关产品推荐
相关产品推荐

