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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:58:48