如何用PySpark拆解含键值与数组的复杂字符串并转换为DataFrame
解决PySpark DataFrame中rms列字符串解析后value1残留
[的问题 问题根源
你当前的代码中,从rms字段拆分出的values字符串是带首尾方括号的格式(比如[800,0,100,0,2.168675,...]),直接按逗号分割后,第一个元素会保留开头的[,导致value1列出现残留字符。
解决方案
在对values进行分割前,先通过正则替换去掉首尾的方括号[和],再执行分割操作即可解决该问题。
修改后的完整代码
import pyspark.sql.functions as F from pyspark.sql.functions import * data_source = "/curated/SensorMEDCurated" df = read_delta_from_datalake(global_definitions["curated_dl_zone"], data_source) print("Original Data:") df.select("rms").show(1, truncate=False) # 提取每个键值对的正则表达式 extract_all_pattern = "'(\\d+=\\[[^\\]]+\\])'" df = df.withColumn("rms", F.expr(f"regexp_extract_all(rms, {extract_all_pattern}, 1)")) \ .withColumn("rms", F.explode("rms")) # 拆分键和值部分 df = df.withColumn("outer_value", split(df["rms"], '=').getItem(0)) df = df.withColumn("values", split(df["rms"], '=').getItem(1)) # 移除values字符串首尾的方括号 df = df.withColumn("values", F.regexp_replace("values", "^\\[|\\]$", "")) # 分割数值数组 df = df.withColumn("values", F.split("values", "[\\s*,\\s*]")) # 展开为多列 df = df.select(["outer_value"] + [F.element_at("values", i).alias(f"value{i}") for i in range(1,16)]) df.show()
关键修改说明
- 添加
F.regexp_replace("values", "^\\[|\\]$", ""):用正则匹配字符串开头的[和结尾的],并替换为空字符串,清理掉多余的方括号后再进行分割,就能保证value1列的数值正常。
内容的提问来源于stack exchange,提问作者Cengiz
相关产品推荐
相关产品推荐

