PySpark实现DataFrame列字符串拆分为表头与对应值的方法
PySpark 不规则键值格式列转规范宽表实现
核心思路
col1、col2、col3的统一格式为「表头名称 : 对应取值」,仅表头与冒号间存在无规律空格,且需求明确最终输出为固定结构的4列(id、HeaderOne、HeaderTwo、HeaderThree)。
不推荐动态提取冒号前文本拼接列名的通用方案:这类方案会因单元格内表头文本的微小差异(如拼写偏差、空格数量波动)生成非预期列名,甚至出现列错位。直接将拆分后的取值映射到固定目标列,是稳定性最高、取值匹配最精准的实现方式。
样例效果对照
原始DataFrame片段:
| id | col1 | col2 | col3 |
|---|---|---|---|
| 101 | HeaderOne : 研发部 | Header Two : 15K | HeaderThree : P5 |
| 102 | HeaderOne : 产品部 | Header Two : 22K | HeaderThree : P7 |
处理后规范DataFrame片段:
| id | HeaderOne | HeaderTwo | HeaderThree |
|---|---|---|---|
| 101 | 研发部 | 15K | P5 |
| 102 | 产品部 | 22K | P7 |
可直接复用的代码实现
- 导入依赖
from pyspark.sql import functions as F - 定义通用提取逻辑,兼容冒号前后的任意不规则空格
def extract_kv_value(raw_col): # 按第一个冒号拆分单元格内容,提取冒号后的文本,去除首尾多余空格 return F.trim(F.split(F.col(raw_col), ":")[1]) - 逐列处理生成最终规范表
standard_df = raw_df \ .withColumn("HeaderOne", extract_kv_value("col1")) \ .withColumn("HeaderTwo", extract_kv_value("col2")) \ .withColumn("HeaderThree", extract_kv_value("col3")) \ .select("id", "HeaderOne", "HeaderTwo", "HeaderThree")
边界场景适配
如果存在取值内容本身包含冒号的情况,可将split替换为正则提取逻辑,避免取值被截断:
def extract_kv_value(raw_col): # 正则匹配冒号前任意非冒号字符后的内容,自动过滤值前的多余空格 return F.trim(F.regexp_extract(F.col(raw_col), r"^[^:]*:(.*)$", 1))
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

