替换配置单元中存储为字符串的json对象中的特定元素

mi7gmzs6  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(413)

我有一个配置单元表,其中一列有一个字符串数据类型,它实际上存储了一个json对象。
我试图在该表上触发select,但我只想替换json中的一个元素。例如,假设对于特定的配置单元行,包含json的列的值为:-

{  
    "employee": {  
        "name":       "sonoo",   
        "salary":     56000,   
        "married":    true  
    }  
}

现在我想用null(或空白等)替换元素$.employee.name的值(当前值是“sonoo”)。因此select语句应该返回以下内容

{  
    "employee": {  
        "name":       null,   
        "salary":     56000,   
        "married":    true  
    }  
}

有什么办法吗?

uplii1fm

uplii1fm1#

如果您不想解析所有的json元组并重新组装json,那么这就是使用sing的解决方案 regex_replace :

with your_data as (
select stack (1,
'{  
    "employee": {  
        "name":       "sonoo",   
        "salary":     56000,   
        "married":    true  
    }  
}') as json_str
) --use you_table instead of this

 select regexp_replace(json_str,'(\\"employee\\":\\s*\\{\\s*\\"name\\":\\s*)(\\".*\\")([\\S\\s]*)','$1null$3') as json_str
  from your_data s;

结果:

OK
{
    "employee": {
        "name":       null,
        "salary":     56000,
        "married":    true
    }
}
Time taken: 0.074 seconds, Fetched: 1 row(s)

正则表达式中的第一组描述了要替换的值之前的所有内容: (\\"employee\\":\\s*\\{\\s*\\"name\\":\\s*) -指: \\"employee\\": -“雇员”:字面意思是, \\s* -任意数量的空间 \\{ -{字符 \\s* -任意数量的空间 \\"name\\": -“姓名”: \\s* -任意数量的空间
为什么第一个组被描述得如此详细,包括员工密钥?为了确保只替换employee嵌套结构中的name值,而不替换其他名称(可以在其他嵌套结构中)。
secong group是要替换的双引号字符串: (\\".*\\") 第三组是第二组之后的所有其他组: ([\\S\\s]*) -任意数量的空格或非空格字符。如果json不包含换行符,\n则只需使用(.*)即可,请自己测试它
因此,regexp匹配整个json,由三个组组成。你要用 '$1null$3' -第一组、空组和第三组连接在一起。换言之,第二个组将替换为null,其他所有组保持原样。

相关问题