hive 临时表_Hive自定义函数后,编译源码,并解决数据倾斜

一、下载源码

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

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

8dda8fcd363a83893fef33b2effb76d1.png

二、自定义函数

2.1 添加随机数前缀函数

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

d16d4890f3fb737dc25c1c5454975e01.png
e1018dac09edcf5ae99f368198b02aab.png

2.2 移除前缀函数

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

8029e85a051f157ef33deda175a87519.png

2.3 注册函数

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

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

52ccf7dbf249dcfaf3f2b800e55cbfcf.png
636dad7c556ea45d24f88949b31f0e4b.png

三、编译

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

705fc050971a2bf0ee149cee5f60e2c7.png

然后执行下面命令

mvn clean package -DskipTests -Phadoop-2 -Pdist

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

58854059fe7221a05692411b44027bd4.png

四、结果

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

307bbe2284a1801120c3ca826c950e69.png

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


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

a35f6e9e761ef873093387b012eff821.png

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

f014edbffbd02cad028c86d3a80af7b6.png

五、测试函数

查看函数

show functions;

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

bbbabe4ded28cc681c267e338283a9d6.png
dea9f26c8059ca5dccf5c37f4b52c25d.png

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

desc function extended add_random_prefix;

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

0c7db463eb076696280b6b21f2433ccf.png

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

select add_random_prefix('hive',10);

自动给我们加上随机数了

85fd1ad30df4376de2c5b8374b40c111.png

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

select remove_random_prefix('9_hive');

0b740d8639b4653eca08d38b938c3bc1.png

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

六、解决数据倾斜问题

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

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

6.1 先把uid打散

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

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

4b5225951adb95a721bf95efab7dcb34.png

6.2 第一次聚合

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

85589ab5b89e9baf3b9ab08e00195852.png
5ca8ff52bf4884688bedeb003db2e9bf.png

6.3 移除随机数

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

14963226cf9bdece7e138134bf3e6b2f.png
49d956d8068aedbe027ae072c8bf54fb.png

6.4 第二次聚合

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

3507224d975f1547d59fa317f68183a8.png
601d5b0365aae8f1cc5e9554275550a3.png

到此数据倾斜解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值