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

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

关键说明

  1. 用trim()处理字段空格,避免因空格导致长度判断错误
  2. Spark SQL的substring参数为substring(str, pos, len),pos从1开始计数,修正原查询的索引错误
  3. 空JSON场景直接生成新JSON字符串,逻辑更简洁
  4. 非空JSON场景只需截取原字符串去掉末尾},拼接新键值对后再补回}即可,}无需转义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:35:23