最近项目中需要对埋点日志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的问题的。

转载请注明出处:https://www.cnblogs.com/fnlingnzb-learner/p/13442744.html

Hive对字段进行urlDecode的更多相关文章

  1. [Hive]新增字段(column)后,旧分区无法更新数据问题

    问题描述: 实际应用中,常常存在修改数据表结构的需求,比如:增加一个新字段. 如果使用如下语句新增列,可以成功添加列col1.但如果数据表tb已经有旧的分区(例如:dt=20190101),则该旧分区 ...

  2. Talend 将Oracle中数据导入到hive中,根据系统时间设置hive分区字段

    首先,概览下任务图: 流程是,先用tHDFSDelete将hdfs上的文件删除掉,然后将oracle中的机构表中的数据导入到HDFS中:建立hive连接->hive建表->tJava获取系 ...

  3. Hbase与hive整合

    //hive与hbase整合create table lectrure.hbase_lecture10(sname string, score int) stored by 'org.apache.h ...

  4. hive创建表带中文注释报错解决方法

    hive创建带有中文注释的表报错: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask ...

  5. Hive 的简单使用及调优参考文档

    Hive 的简单使用及调优参考文档   HIVE的使用 命令行界面 使用一下命令查看hive的命令行页面, hive --help --service cli 简化命令为hive –h 会输出下面的这 ...

  6. hive sql常用整理-hive引擎设置

    遇到个情况,跑hive级联insert数据报错,可以尝试换个hive计算引擎 hive遇到FAILED: Execution Error, return code 2 from org.apache. ...

  7. hive中解决中文乱码

    一.个人初始开发环境的基本情况以及Hive元数据库说明 ①hive的元数据库改成了mysql(安装完mysql之后也没有进行其它别的设置) ②hive-site.xml中设置元数据库对应的配置为  j ...

  8. 大数据开发实战:离线大数据处理的主要技术--Hive,概念,SQL,Hive数据库

    1.Hive出现背景 Hive是Facebook开发并贡献给Hadoop开源社区的.它是建立在Hadoop体系架构上的一层SQL抽象,使得数据相关人员使用他们最为熟悉的SQL语言就可以进行海量数据的处 ...

  9. hive 上篇

    hive 是以hadoop为基础的数据仓库,使用HQL查询存放在HDFS上面的数据,HSQL是一种类SQL的语句,最终会被编译成map/reduce,HSQL可以查询HDFS上面的数据:不支持记录级别 ...

随机推荐

  1. java 数据结构(八):Iterator接口与foreach循环

    1.遍历Collection的两种方式:① 使用迭代器Iterator ② foreach循环(或增强for循环)2.java.utils包下定义的迭代器接口:Iterator2.1说明:Iterat ...

  2. JavaScript动画实例:动感小球

    已知圆的坐标方程为: X=R*SIN(θ) Y=R*COS(θ)     (0≤θ≤2π) 将0~2π区间等分48段,即设定间隔dig的值为π/24.θ初始值从0开始,按曲线方程求得坐标值(x,y), ...

  3. 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透

    前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...

  4. js 自定义阻止事件冒泡函数

    // 以下改方法全兼容Chrome function stopBubble(event){ if(event.stopPropagation){   // 兼容火狐(firebox) event.st ...

  5. sql与SQL CODE和SQL State相关报错

    操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原 ...

  6. oracle添加配置多个端口监听

    原来配置:listener.ora文件如下: LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOS ...

  7. 第四章:View的工作原理

    4.1 ViewRoot和DecorView ViewRoot对应于ViewRootImplement类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过Vie ...

  8. Burp Suite Target Module - 目标模块

    模块目的之一:获取网站分析 1.从Proxy - HTTP history界面选中需要加入Target Scope的Host 地址,右击,选中Add to Scope. 2.打开Target - Sc ...

  9. OSCP Learning Notes - WebApp Exploitation(5)

    Remote File Inclusion[RFI] Prepare: Download the DVWA from the following website and deploy it on yo ...

  10. patelinux 安装

    参考文档:https://china.xilinx.com/support/documentation/sw_manuals/xilinx2017_2/ug1144-petalinux-tools-r ...