一、下载源码

首先进入网站:http://archive.cloudera.com/cdh5/cdh/5/

然后搜索 hive-1.1.0-cdh5.15.1-src




hive temporary 临时表需要删除吗 hive临时表_hive 临时表


二、自定义函数

2.1 添加随机数前缀函数

解压之后,可以用idea打开工程,然后在目录hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一个类UDFAddRandomPrefix


hive temporary 临时表需要删除吗 hive临时表_h5_02


hive temporary 临时表需要删除吗 hive临时表_随机数_03


2.2 移除前缀函数

同样的在目录hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一个类UDFRemoveRandomPrefix


hive temporary 临时表需要删除吗 hive临时表_h5_04


2.3 注册函数

上面的函数类我们已经定义好了,但是要注册一下,hive才会知道我们自己写的两个函数,

在类FunctionRegistry的静态代码块static下添加如下代码:


hive temporary 临时表需要删除吗 hive临时表_hive_05


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_06


三、编译

终端切换到hive-1.1.0-cdh5.15.1目录


hive temporary 临时表需要删除吗 hive临时表_hive_07


然后执行下面命令

mvn clean package -DskipTests -Phadoop-2 -Pdist

最后出现下面这个图,说明编译成功


hive temporary 临时表需要删除吗 hive临时表_随机数_08


四、结果

最终打包后的文件在hive-1.1.0-cdh5.15.1/packaging/target目录下


hive temporary 临时表需要删除吗 hive临时表_hive_09


后面直接进行部署就可以了


下图是hive-exec模块的编译结果


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_10


因为我们刚刚添加的函数在hive-exec模块下添加自定义函数的,也可以把hive-exec-1.1.0-cdh5.15.1.jar直接上传部署好hive的lib目录下面


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_11


五、测试函数

查看函数

show functions;

可以看到我们自己定义的两个函数了,如下图


hive temporary 临时表需要删除吗 hive临时表_随机数_12


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_13



我们看下函数的详细描述,看看文档是不是我们刚刚写的

desc function extended add_random_prefix;

如下图,这些不就是我们刚刚自定义函数写的说明么


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_14


我们来使用一下这个函数:

select add_random_prefix('hive',10);

自动给我们加上随机数了


hive temporary 临时表需要删除吗 hive临时表_hive_15


我们再测试一下移除随机数

select remove_random_prefix('9_hive');


hive temporary 临时表需要删除吗 hive临时表_h5_16


到这里,说明我们的自定义的函数没有问题

六、解决数据倾斜问题

数据倾斜一般发生在聚合计算的时候,由于相同的key过多导致的,导致有一个task可能会计算的很慢,导致整个job的时间很长


hive temporary 临时表需要删除吗 hive临时表_随机数_17


  1. 上面这个数据,是每个用户购买的产品,现在我们要计算每个用户总共购买了多少产品;
  2. 从上面的数据可以看出user3用户比较多,如果数量再扩大几十万倍,进行聚合的时候会发生数据倾斜的问题了,那么我们可以用上面两个自定义的函数解决数据倾斜问题

6.1 先把uid打散

打散的意思就是在uid字段的值前面加上随机数

select add_random_prefix(uid,5) as rdm_uid from user_pid;


hive temporary 临时表需要删除吗 hive临时表_随机数_18


6.2 第一次聚合

把上面一次查询的结果作为临时表,对打散后的uid进行第一次聚合


hive temporary 临时表需要删除吗 hive临时表_h5_19


hive temporary 临时表需要删除吗 hive临时表_随机数_20


6.3 移除随机数

现在可以用移除随机数的函数,把上面的结果uid前面的随机数进行移除


hive temporary 临时表需要删除吗 hive临时表_随机数_21


hive temporary 临时表需要删除吗 hive临时表_随机数_22


6.4 第二次聚合

把上面的结果作为临时表,把uid作为分组条件,对cnt进行求和,就可以得到我们的结果


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_23


hive temporary 临时表需要删除吗 hive临时表_hive 临时表_24


到此数据倾斜解决