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

PySpark split函数使用问题:按点分割列遇全空值

问题解决:PySpark按英文句号分割列

问题原因

你的代码存在两个核心问题:

  1. 正则表达式转义错误:split函数的分隔符参数是正则表达式,英文句号.在正则中代表匹配任意字符,而非实际的句号。直接用.会把每个字符都分割开,导致无法得到正确的数组结果。
  2. 代码逻辑错误:第二次操作直接基于原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:27:36