PySpark中基于#位置截断DataFrame字符串列的实现方法
纯PySpark实现按#截断字符串列
不需要用自定义UDF或者SparkSQL,直接用PySpark内置函数就能搞定,下面是两种可靠的实现方式:
方法1:使用substring_index(推荐)
这是最简洁的方式,substring_index专门用于按指定分隔符截取字符串,完全适配你的需求:
from pyspark.sql.functions import substring_index # 假设你的字符串列名为str_col,生成截断后的新列truncated_str df_processed = df.withColumn("truncated_str", substring_index(df.str_col, "#", 1))
- 逻辑:从左到右定位第一个
#,截取其左侧所有字符;如果字符串中没有#,直接返回原字符串。
方法2:使用instr+substring+when
如果需要更精细的控制,可以结合位置判断和字符串截取:
from pyspark.sql.functions import instr, substring, when, col df_processed = df.withColumn( "truncated_str", when(instr(col("str_col"), "#") > 0, substring(col("str_col"), 1, instr(col("str_col"), "#") - 1)) .otherwise(col("str_col")) )
- 逻辑:先用
instr获取#的位置,若存在(位置>0)则截取到#之前的部分,否则保留原字符串。
关于你遇到的TypeError
你之前的报错大概率是直接在PySpark的Column对象上使用了Python原生字符串方法(比如str.split),PySpark列不能直接用Python原生操作,必须使用PySpark提供的内置函数来处理。
内容的提问来源于stack exchange,提问作者Ankit Tyagi
相关产品推荐
相关产品推荐

