hive中能⽤decode_Hive对字段进⾏urlDecode
最近项⽬中需要对埋点⽇志hive表进⾏分析,并且按⼀定的规则统计出来满⾜要求的⽤户pin。本来以为是⼀件⽐较简单的事,结果在查看导出的词表时发现很多带有"%"的明显具有url encode特征的⽤户pin,于是就开启了这篇⽂章⽤hive对字段进⾏urlDecode的探索。
在查看了⼀些资料后,刚开始我是选择直接⽤reflect函数调⽤java⾃带的URLDecoder⽅法来对ur_pin进⾏处理的,具体hive sql如下:气喘如牛
hive -e "lect reflect('java.URLDecoder', 'decode', ur_pin, 'UTF-8') as ur_pin from table where [condition]"
本来以为解决了问题⼤功告成了,结果跑数的时候总出现下⾯这个异常:北京作文
枫桦豪景
URLDecoder异常Illegal hex characters in escape (%)
心灵共鸣查看了⼀下源数据,发现是因为有些⽤户pin中本来就带有"%"导致的(可能是⾮法攻击或者埋点上报异常引起),使URLDecode失败。参照了⼀下之前java处理URLDecode异常的经验,想着在url解码之前对数据先做⼀些预处理,但是由于reflect基本只有在调⽤静态⽅法的时候才有意义,所以不能直接通过reflect⽤replaceAll⽅法。于是想到了⽤hive⾃带的udf中的regexp_replace来替代replaceAll,具体代码如下:壮丽的反义词
我不知道的英文能力的分类#如果是⽤的单引号包裹查询语句值,需要对!进⾏处理
脱式计算五年级sql="lect reflect('java.URLDecoder', 'decode', regexp_replace(regexp_replace(ur_pin, '%(?\\![0-9a-fA-F]{2})', '%25'),
'\\\\+', '%2B'), 'UTF-8') from table where [condition]"#如果是⽤双引号包裹查询语句值
sql='''lect reflect("java.URLDecoder", "decode", regexp_replace(regexp_replace(ur_pin, "%(?![0-9a-fA-F]{2})", "%25"), "\\\\+", "%2B"), "UTF-8") from table where [condition]'''#执⾏sql
hive-e "$sql"
如果你⽤的是单引号包裹查询语句的值的时候,⼀定要记得对!进⾏转义,否则会出现-bash: !": event not found的问题的。