PySpark如何解析类字典格式字符串并提取指定键为DataFrame新列
Spark解析raw_geocode字段提取指定键值实现方案
前置条件
已完成预处理的raw_geocode字段会先移除外层的[]、非必要的单引号字符,存储为类似{road: Calle el Topo, country_code: es}的字符串结构,无需重复做外层符号清洗。
实现步骤
1. 将字符串格式的类字典内容转换为Spark Map类型
导入Spark内置函数,通过str_to_map把字符串键值对转换为可按键取值的Map结构:
from pyspark.sql import functions as F # 清洗字符串外层的花括号,按实际分隔符解析为Map df_parsed = df.withColumn( "geocode_map", F.str_to_map( input=F.expr("trim(regexp_replace(raw_geocode, '[{}]', ''))"), # 指定实际内容里的键值对分隔符、键值内部分隔符 pairDelim=", ", keyValueDelim=": " ) )
2. 批量提取指定键生成新列
提前定义需要提取的目标键列表,循环遍历从解析好的Map中取值——Map结构取不到指定键时会自动返回NULL,完全符合空值填充要求:
# 定义需要提取的目标键清单 extract_keys = ['road', 'tourism', 'country_code'] df_final = df_parsed for key in extract_keys: df_final = df_final.withColumn( key, F.col("geocode_map").getItem(key) ) # 清理不需要的中间字段和原始字段 df_final = df_final.drop("geocode_map", "raw_geocode")
效果说明
对照测试用例的输出逻辑:
- 第一行数据的键值集合包含
road、country_code,无tourism键,最终tourism列自动填充NULL - 第二行数据的键值集合包含
tourism、country_code,无road键,最终road列自动填充NULL - 存在的键直接读取对应值填充,输出结构和期望结果完全一致
常见问题处理
如果出现值被截断、键值匹配错位的情况,说明地址内容内部本身包含逗号、冒号字符,触发了默认分隔符的拆分规则。只需在解析Map前,把字符串内的实际分隔符替换为地址内容中不会出现的特殊符号(比如用|#|做键值对分隔符、用#@#做键值内部分隔符),再传入str_to_map的自定义分隔符参数即可解决。
内容的提问来源于stack exchange,提问作者anthelix
相关产品推荐
相关产品推荐

