如何使用点(.)分隔符拆分PySpark DataFrame列及解决split方法失效问题
解决PySpark中用split拆分带点(.)列失效的问题
嘿,我太懂你踩的这个坑了!直接用split方法拆分带点的列没生效,核心原因是正则表达式里的.是特殊通配符——它会匹配任意单个字符,而不是你想要的字面意义上的点。所以直接写split("col_name", ".")只会把每个字符都拆分开,完全达不到预期效果。
下面给你几个靠谱的解决方案:
1. 正确转义点字符
要匹配字面意义的点,你需要用正则转义符\,但在Python字符串里\本身需要转义,所以得写成\\.,或者用Python的raw字符串r"\."会更清晰:
from pyspark.sql import SparkSession from pyspark.sql.functions import split, col # 初始化SparkSession spark = SparkSession.builder.appName("SplitDotColumn").getOrCreate() # 创建测试DataFrame data = [("abcd.efgh",), ("ijkl.mnop.qrst",)] df = spark.createDataFrame(data, ["original_col"]) # 转义点进行拆分(两种写法二选一) df_split = df.withColumn("split_result", split(col("original_col"), "\\.")) # df_split = df.withColumn("split_result", split(col("original_col"), r"\."))
2. 把拆分后的数组转为单独列
拆分后会得到一个数组列,如果你想把它拆成两个独立的列(比如对应前后两部分),可以用下面两种简洁的方式:
方法一:使用getItem提取数组元素
df_final = df_split.withColumn("first_part", col("split_result").getItem(0)) \ .withColumn("second_part", col("split_result").getItem(1)) \ .drop("split_result")
方法二:使用selectExpr一步到位
df_final = df.selectExpr( "original_col", "split(original_col, '\\\\.', 2)[0] as first_part", "split(original_col, '\\\\.', 2)[1] as second_part" )
这里的2是拆分次数参数,意思是最多拆分成2部分——就算原字符串有多个点,也只会在第一个点的位置拆分,刚好符合你把abcd.efgh拆成两列的需求。
测试结果展示
运行上面的代码后,df_final的输出结果会是:
| original_col | first_part | second_part |
|---|---|---|
| abcd.efgh | abcd | efgh |
| ijkl.mnop.qrst | ijkl | mnop.qrst |
这样就完美解决你的问题啦!
内容的提问来源于stack exchange,提问作者Indra
相关产品推荐
相关产品推荐

