数仓-解决hive处理异常json命令行转义字符的问题
[TOC]
前言
在etl清洗流程中,前一步处理将数据清洗到hive中,hive某字段中落有json字符串。我需要将json中的嵌套json解析为单独的字段。

解析为id_no、name、mobile、apply_id... extend_params_ip 、extend_params_ip_user_number、extend_params_contact(直接存储数组)...
重新解析到hive外部表,实际落入到hbase
但是之前落入hive的人未处理异常json的情况如上图,所以,我的处理手段是将json中的异常字符如\" 替换为"。故事就这样开始了
1. 在hue中测试处理json
参考 转义字符反斜杠\(在hive+shell以及java中注意事项)
可以知道:
转义字符的特殊情况,自身的转义,比如java有时候需要两个转义字符
\\,或者四个转义字符\\\\。 1)java的两种情况
正则表达式匹配
string的split函数
这两种情况中字符串包含转义字符"\"时,需要先对转义字符自身转义,就是说需要两个转义字符"\"。(java解析后,再有正则和split自身特定进行解析)
而当匹配字符正斜线
\,则需要四个转义字符\\\\,因为,首先java(编译器?)自身先解析,转义成\\(两个\),再由正则或split的解析功能转义成一个\,才是最终要处理的字符。这是因为解析过程需要两次,才能在字符串中出现正斜线"\",出现后才能转义后面的字符。
2)hive中的split和正则表达式
hive用java写的,所以同Java一样,两种情况也需要两个"\"。如果是正则的话或者split的话,要匹配
\需要4个\
如果hive和shell和正则再相遇,那么将是三次解析shell语言也有转义字符,自身直接处理。 而hive语句在shell脚本中执行时,就需要先由shell转义后,再由hive处理。这个过程又造成二次转义。 所以,注意hive语句在shell脚本执行时,转义字符需要翻倍。hive处理的是shell转义后的语句,必须转以后正确,才能执行。如果是一个
\,则需要6个 :\\\\\\,
本次用到函数regexp_replace第二参数本身就是一个正则,那么hive+正则,就是两次转义,对于反斜杠\,就是\\\\,对于"是\\"
hue先测试一条数据
得到结果

当时没有细看,就直接写入到脚本开始调度
谁曾想
2. 命令行调用hive
所以直接将hue的脚本命令拷入脚本执行,结果无一正确结果,返回来看,发现会经历shell首先会解析一次,所以增加一个斜杠用8个代替
shell执行的时候,就可以看到解析了一次

转义字符就少了一半,第一次就是双反斜杠变为单反斜杠,最后打完收工
show的最原始
Last updated
Was this helpful?