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
相关产品推荐
相关产品推荐

