hive中能用decode_Hive对字段进行urlDecode

最近项目中需要对埋点日志hive表进行分析,并且按一定的规则统计出来满足要求的用户pin。本来以为是一件比较简单的事,结果在查看导出的词表时发现很多带有"%"的明显具有url encode特征的用户pin,于是就开启了这篇文章用hive对字段进行urlDecode的探索。

在查看了一些资料后,刚开始我是选择直接用reflect函数调用java自带的URLDecoder方法来对user_pin进行处理的,具体hive sql如下:

hive -e "select reflect('java.net.URLDecoder', 'decode', user_pin, 'UTF-8') as user_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="select reflect('java.net.URLDecoder', 'decode', regexp_replace(regexp_replace(user_pin, '%(?\\![0-9a-fA-F]{2})', '%25'), '\\\\+', '%2B'), 'UTF-8') from table where [condition]"#如果是用双引号包裹查询语句值

sql='''select reflect("java.net.URLDecoder", "decode", regexp_replace(regexp_replace(user_pin, "%(?![0-9a-fA-F]{2})", "%25"), "\\\\+", "%2B"), "UTF-8") from table where [condition]'''#执行sql

hive-e "$sql"

如果你用的是单引号包裹查询语句的值的时候,一定要记得对!进行转义,否则会出现-bash: !": event not found的问题的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值