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

PySpark如何explode @{...}格式字符串列并拆分展开为多列

PySpark 特殊格式字符串列拆分方案

你遇到的@{key=value; key2=value2}格式字符串没有特殊编码规则,结构完全固定:

  • 外层统一用@{开头、}结尾做包裹
  • 内部多个属性用分号分隔
  • 单个属性的键和值用等号分隔

优先用Spark内置函数实现,避免自定义UDF带来的序列化开销,性能最高。

实现步骤

  1. 用正则替换掉字符串首尾的@{和},拿到纯键值对字符串
  2. 调用内置str_to_map函数,直接把键值对字符串解析成Map结构
  3. 从Map中按key提取需要的字段,和原有保留列拼接即可得到最终结果

完整代码

from pyspark.sql import functions as F

# 核心处理逻辑
df_output = df_input.select(
    "id",
    # 清洗外层包裹符 + 字符串转Map
    F.expr("""
        str_to_map(
            regexp_replace(firstCol, '^@\\{|\\}$', ''), 
            '; ', 
            '='
        )
    """).alias("kv_map")
).select(
    "id",
    F.col("kv_map")["name"].alias("name"),
    F.col("kv_map")["age"].cast("int").alias("age")
)

# 打印结果验证
df_output.show()

运行结果

+---+-----+---+
| id| name|age|
+---+-----+---+
|  1| Hans| 45|
|  2| Jeff| 15|
|  3|Elona| 23|
+---+-----+---+

适配说明

  • 如果实际数据中分号、等号前后的空格数量不固定,可以调整正则规则做兼容,比如把分隔符从; 改成;\\s*即可匹配分号后任意数量的空格
  • 后续如果新增其他属性字段,不需要修改拆分逻辑,直接从kv_map中按key取值即可,扩展性更强
  • 所有逻辑均由Spark原生引擎执行,没有跨进程序列化开销,TB级数据量下也能稳定高效运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:39:19