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

PySpark如何将单个列按空格分割为3个指定列

Spark DataFrame拆分text列为指定三列的实现方案

核心思路是用正则表达式捕获分组实现拆分规则,同时兼容空值、少元素等边界场景。

正则拆分逻辑

使用正则^(\S+)\s*(\S+)?\s*(.*)?实现三个分组的捕获:

  • 第1分组:匹配开头第一个非空格序列,对应text1
  • 第2分组:匹配第二个非空格序列,对应text2
  • 第3分组:匹配剩余所有内容(包含中间空格),对应text3
    捕获不到内容时返回空字符串,统一转为null即可符合预期输出。

PySpark实现

from pyspark.sql import functions as F

# df为原始DataFrame
processed_df = df.withColumn("trimmed_text", F.trim(F.col("text"))) \
                 .withColumn("text1", F.regexp_extract("trimmed_text", r"^(\S+)\s*(\S+)?\s*(.*)?", 1)) \
                 .withColumn("text2", F.regexp_extract("trimmed_text", r"^(\S+)\s*(\S+)?\s*(.*)?", 2)) \
                 .withColumn("text3", F.regexp_extract("trimmed_text", r"^(\S+)\s*(\S+)?\s*(.*)?", 3)) \
                 .replace("", None, subset=["text1", "text2", "text3"]) \
                 .drop("trimmed_text")

Spark SQL实现

SELECT 
    text,
    NULLIF(regexp_extract(trim(text), '^(\\S+)\\s*(\\S+)?\\s*(.*)?', 1), '') AS text1,
    NULLIF(regexp_extract(trim(text), '^(\\S+)\\s*(\\S+)?\\s*(.*)?', 2), '') AS text2,
    NULLIF(regexp_extract(trim(text), '^(\\S+)\\s*(\\S+)?\\s*(.*)?', 3), '') AS text3
FROM 你的表名

Scala Spark实现

import org.apache.spark.sql.functions.{regexp_extract, trim, col}

val processedDF = df
  .withColumn("trimmed_text", trim(col("text")))
  .withColumn("text1", regexp_extract(col("trimmed_text"), "^(\\S+)\\s*(\\S+)?\\s*(.*)?", 1))
  .withColumn("text2", regexp_extract(col("trimmed_text"), "^(\\S+)\\s*(\\S+)?\\s*(.*)?", 2))
  .withColumn("text3", regexp_extract(col("trimmed_text"), "^(\\S+)\\s*(\\S+)?\\s*(.*)?", 3))
  .na.replace(Seq("text1", "text2", "text3"), Map("" -> null))
  .drop("trimmed_text")

内容的提问来源于stack exchange,提问作者MAMS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:24:02