一、下载源码
首先进入网站:http://archive.cloudera.com/cdh5/cdh/5/
然后搜索 hive-1.1.0-cdh5.15.1-src
二、自定义函数
2.1 添加随机数前缀函数
解压之后,可以用idea打开工程,然后在目录hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一个类UDFAddRandomPrefix
2.2 移除前缀函数
同样的在目录hive-1.1.0-cdh5.15.1/ql/src/java/org/apache/hadoop/hive/ql/udf下新建一个类UDFRemoveRandomPrefix
2.3 注册函数
上面的函数类我们已经定义好了,但是要注册一下,hive才会知道我们自己写的两个函数,
在类FunctionRegistry的静态代码块static下添加如下代码:
三、编译
终端切换到hive-1.1.0-cdh5.15.1目录
然后执行下面命令
mvn clean package -DskipTests -Phadoop-2 -Pdist
最后出现下面这个图,说明编译成功
四、结果
最终打包后的文件在hive-1.1.0-cdh5.15.1/packaging/target目录下
后面直接进行部署就可以了
下图是hive-exec模块的编译结果
因为我们刚刚添加的函数在hive-exec模块下添加自定义函数的,也可以把hive-exec-1.1.0-cdh5.15.1.jar直接上传部署好hive的lib目录下面
五、测试函数
查看函数
show functions;
可以看到我们自己定义的两个函数了,如下图
我们看下函数的详细描述,看看文档是不是我们刚刚写的
desc function extended add_random_prefix;
如下图,这些不就是我们刚刚自定义函数写的说明么
我们来使用一下这个函数:
select add_random_prefix('hive',10);
自动给我们加上随机数了
我们再测试一下移除随机数
select remove_random_prefix('9_hive');
到这里,说明我们的自定义的函数没有问题
六、解决数据倾斜问题
数据倾斜一般发生在聚合计算的时候,由于相同的key过多导致的,导致有一个task可能会计算的很慢,导致整个job的时间很长
- 上面这个数据,是每个用户购买的产品,现在我们要计算每个用户总共购买了多少产品;
- 从上面的数据可以看出user3用户比较多,如果数量再扩大几十万倍,进行聚合的时候会发生数据倾斜的问题了,那么我们可以用上面两个自定义的函数解决数据倾斜问题
6.1 先把uid打散
打散的意思就是在uid字段的值前面加上随机数
select add_random_prefix(uid,5) as rdm_uid from user_pid;
6.2 第一次聚合
把上面一次查询的结果作为临时表,对打散后的uid进行第一次聚合
6.3 移除随机数
现在可以用移除随机数的函数,把上面的结果uid前面的随机数进行移除
6.4 第二次聚合
把上面的结果作为临时表,把uid作为分组条件,对cnt进行求和,就可以得到我们的结果
到此数据倾斜解决