Spark SQL拼接'}'字符时解析报错,求解决方案
解决Spark SQL中JSON字符串拼接
}的问题 问题背景
需要在Spark SQL中为JSON格式的字符串字段col_1拼接新的键值对(将col_2的内容作为值),原查询在处理}字符时出现解析失败,需针对空JSON{}和非空JSON两种场景实现正确拼接。
示例数据集
+--------------------------------------+-----+ |col_1 |col_2| +--------------------------------------+-----+ |{"key_1" : "val_1","key_2" : "val_2"}|abcd | +--------------------------------------+-----+ root |-- col_1: string (nullable = true) |-- col_2: string (nullable = true)
原查询问题
原尝试的SQL因字符串截取索引错误导致}拼接失败,原SQL如下:
select *, case when length(col_1) = 2 then concat(substring(col_1, 0, length(col_1) - 1), '"col_2":"',cast(col_2 as STRING), '"}') else concat(substring(col_1, 0, length(col_1) - 1), ',"col_2":"', cast(col_2 as STRING), '"}') end as mod_col_1 from df
预期输出
场景1:col_1为{}时
输入:
+------+-----+ |col_1 |col_2| +------+-----+ |{} |abcd | +------+-----+
输出:
+------+-----+-----------------------+ |col_1 |col_2|mod_col_1 | +------+-----+-----------------------+ |{} |abcd |{"col_2" : "abcd"} | +------+-----+-----------------------+
场景2:col_1为非空JSON时
输入:
+--------------------------------------+-----+ |col_1 |col_2| +--------------------------------------+-----+ |{"key_1" : "val_1","key_2" : "val_2"}|abcd | +--------------------------------------+-----+
输出:
+--------------------------------------+-----+-------------------------------------------------------+ |col_1 |col_2|mod_col_1 | +--------------------------------------+-----+-------------------------------------------------------+ |{"key_1" : "val_1","key_2" : "val_2"}|abcd |{"key_1" : "val_1","key_2" : "val_2","col_2":"abcd"}| +--------------------------------------+-----+-------------------------------------------------------+
解决方案
核心问题是Spark SQL的substring索引从1开始计数,原查询使用0作为起始索引导致截取异常,同时无需转义},只需修正字符串处理逻辑:
修正后的SQL:
SELECT *, CASE -- 判断是否为空JSON(去除空格后长度为2) WHEN length(trim(col_1)) = 2 THEN concat('{"col_2":"', trim(col_2), '"}') ELSE -- 截取原字符串到倒数第二个字符(去掉末尾的"}"),拼接新键值对后闭合JSON concat( substring(trim(col_1), 1, length(trim(col_1)) - 1), ',"col_2":"', trim(col_2), '"}' ) END AS mod_col_1 FROM df
关键说明
- 用
trim()处理字段空格,避免因空格导致长度判断错误 - Spark SQL的
substring参数为substring(str, pos, len),pos从1开始计数,修正原查询的索引错误 - 空JSON场景直接生成新JSON字符串,逻辑更简洁
- 非空JSON场景只需截取原字符串去掉末尾
},拼接新键值对后再补回}即可,}无需转义
内容的提问来源于stack exchange,提问作者Rajnil Guha
相关产品推荐
相关产品推荐

