PySpark split函数使用问题:按点分割列遇全空值
问题解决:PySpark按英文句号分割列
问题原因
你的代码存在两个核心问题:
- 正则表达式转义错误:
split函数的分隔符参数是正则表达式,英文句号.在正则中代表匹配任意字符,而非实际的句号。直接用.会把每个字符都分割开,导致无法得到正确的数组结果。 - 代码逻辑错误:第二次操作直接基于原
df_phone而非第一次生成的df_phone_cc,且未定义split_col变量,导致逻辑断裂。
正确实现代码
基础版:直接分割提取列
from pyspark.sql.functions import col, split # 先分割得到数组列,再提取两个元素作为新列 df_phone_cc = df_phone.withColumn("split_result", split(col("sd_phonenumber"), "\\.")) \ .withColumn("col1", col("split_result").getItem(0)) \ .withColumn("col2", col("split_result").getItem(1)) \ .drop("split_result") # 可选:删除中间数组列
优化版:处理无句号的边界情况
针对没有句号的行(比如6468211444),可以设置默认值逻辑,避免不必要的null:
from pyspark.sql.functions import col, split, when, size df_phone_cc = df_phone.withColumn("split_result", split(col("sd_phonenumber"), "\\.")) \ .withColumn("col1", when(size(col("split_result")) == 2, col("split_result").getItem(0))) \ .withColumn("col2", when(size(col("split_result")) == 2, col("split_result").getItem(1)) .otherwise(col("sd_phonenumber"))) \ .drop("split_result")
代码说明
- 使用
\\.作为分隔符:双反斜杠是为了在Python中转义出正则需要的单个反斜杠,从而精准匹配实际的英文句号。 - 链式调用
withColumn:确保每次操作都基于上一步的DataFrame,避免逻辑错误。 - 边界情况处理:通过
size判断分割后的数组长度,针对无句号的行保留原内容,提升结果合理性。
内容的提问来源于stack exchange,提问作者Xi12
相关产品推荐
相关产品推荐

