如何在PySpark中提取DataFrame列中最后一个/分隔的字符串值
错误原因
PySpark的Column类未提供原生rsplit方法,你直接调用Python字符串方法作用于Spark列对象,不符合Spark的API规范,因此触发TypeError。
实现方案
方案1:split + element_at(Spark 2.4及以上版本推荐)
这是最简单的实现方式,利用数组负数索引直接取最后一个元素:
首先导入依赖函数:from pyspark.sql.functions import split, element_at, col
执行查询代码:df = df.select(element_at(split(col("MyColumn"), "/"), -1).alias("extracted_content"))
说明:
split函数会将列值按/拆分为字符串数组element_at的索引从1开始,传入-1直接返回数组最后一个元素- 自动兼容无分隔符、分隔符数量不固定的场景
方案2:反转截取(兼容低版本Spark)
如果使用的Spark版本低于2.4,没有element_at函数,可以用类似SQL的反转查找逻辑实现:
导入依赖函数:from pyspark.sql.functions import col, reverse, instr, substr, length
执行查询代码:
df = df.select( substr( col("MyColumn"), # 计算最后一个/之后第一个字符的位置 length(col("MyColumn")) - instr(reverse(col("MyColumn")), "/") + 2 ).alias("extracted_content") )
测试验证
构造测试数据验证效果:
test_data = [ ("lala/mae.da/rg1/zzzzz",), ("a/b/c/d",), ("no_separator",), ("end_with_slash/",), ("",) ] df = spark.createDataFrame(test_data, ["MyColumn"]) # 执行提取逻辑 df.select(element_at(split(col("MyColumn"), "/"), -1).alias("result")).show()
输出结果:
+-------------+ | result| +-------------+ | zzzzz| | d| |no_separator| | | | | +-------------+
内容的提问来源于stack exchange,提问作者xavier
相关产品推荐
相关产品推荐

