Scala Spark中修复DataFrame内JSON字符串列的错误值问题
修正Spark DataFrame中错误JSON格式的解决方案
你的原有正则"""(".*?")(".*?")"""存在逻辑问题:它会匹配所有连续的两个带引号的字符串,包括已经正确的键值对(比如"name":"neo"),导致正确的部分被错误修改为"name"::"neo",反而破坏了正常数据。
正确的解决方案
使用带负向先行断言的正则,只匹配键引号后未带冒号、直接跟值引号的错误格式,避免影响正确的JSON内容:
// 适用于键名为字母/数字/下划线的常规场景 val regex = """("[\w]+")(?!:)(".*?")""" df.withColumn("updated_col", regexp_replace(col("value"), regex, "$1:$2"))
如果你的JSON键名可能包含空格或其他特殊字符(符合JSON规范的合法键名),可以用更通用的正则:
val regex = """("([^"]+)")(?!:)(".*?")""" df.withColumn("updated_col", regexp_replace(col("value"), regex, "$1:$2"))
正则说明
"[\w]+"/"([^"]+)":匹配JSON的键名(前者限制为常规标识符,后者支持任意合法键名)(?!:):负向先行断言,确保键的引号后面没有冒号,只定位错误格式"[.*?]":非贪婪匹配值的字符串,避免跨多个键值对或多行匹配
用这个方案处理你提供的错误JSON,会得到正确格式:
{"name":"neo",
"age":"22",
"city":"nowhere",
"country":""}
内容的提问来源于stack exchange,提问作者praneethh
相关产品推荐
相关产品推荐

