[hive]转义符的处理

描述:数据库中某一张表,某字段存数据时带有换行符、双引号等符号。因业务需要,必须将该表的数据拼接成 json 的形式,调用接口上传。在拼接时,由于对转义字符处理缺乏经验,导致拼接失败,研究后解决。

使用工具:hive +shell

示例数据: 

ID 时间 标题 描述
1 2018-5-8 17:43:50 [hive]转义符的"处理" 数据库中某一张表,    某字段存数据时带有换行符、双引号等符号。因业务需要,必须将该表的数据拼接成 json 的形式,调用接口上传。

2

2018-5-8 17:43:53 [hive]    转义符的处理

数据库中某一张表,某字段存数据时带有换行符'\t'、双引号'"'等符号。

因业务需要,必须将该表 的数据拼接成 json 的形式,调用接口上传。

因在Linux中,hive -e "$sql_code" 中 $sql_code 会被转义3次,故而我采用了 hive -f $sql_path 的方式直接执行hive sql脚本文件。

采用处理的方式是 将所有的换行符、双引号直接替换成'_',而不是在特殊符号前添加转义字符'\'。(该方式不可取)

select
    concat('{\"ID\":',ID,
           ',\"时间\":\"',时间,
           ',\"标题\":',regexp_replace(标题,'(\\\\|\\\s|\")','_'),    -- 通过正则表达式过滤特殊字符('\s':过滤所有空格)
           ',\"描述\":',regexp_replace(描述,'(\\\\|\\\s|\")','_'),'}') as json    -- 如果采用 hive -e 应当是8个'\'
from
    table;

拼接成Json串后,为了实现批量上传,采用以下方式:

select 
    concat('[',new_json,']') as result
from(
    select 
        concat_ws('\,',collect_set(rec)) as new_json
    from (
        select
            row_number() over(order by t1.articleid) as row_id,
            concat('{\"ID\":',ID,
                   ',\"时间\":\"',时间,
                   ',\"标题\":',regexp_replace(标题,'(\\\\|\\\s|\")','_'),    -- 通过正则表达式过滤特殊字符('\s':过滤所有空格)
                   ',\"描述\":',regexp_replace(描述,'(\\\\|\\\s|\")','_'),'}') as json
        from
            table
        )
    group by 
        ceil(row_id/20) 
    ) tmp;        

最终的输出结果:

result
[{"ID":1,"时间":"2018-5-8 17:43:50","标题":"[hive]转义符的_处理_","描述":"数据库中某一张表,_某字段存数据时带有换行符、双引号等符号。因业务需要,必须将该表的数据拼接成_json_的形式,调用接口上传。"},
{"ID":2,"时间":"2018-5-8 17:43:53","标题":"[hive]_转义符的处理","描述":"数据库中某一张表,_某字段存数据时带有换行符'\t'、双引号'_'等符号。因业务需要,必须将该表的数据拼接成_json_的形式,调用接口上传。"}]





你可能感兴趣的:([hive])