Hive自定义分区器流程
1. 环境说明
当前环境采用Hadoop3.1.3以及Hive3.1.2版本!
2. 自定义类
自定义类实现org.apache.hadoop.mapred.Partitioner(必须为这个,Hive中使用的是老的API)接口,这里只是做测试,所以所有数据我现在全部发送至0号分区
注意分区器中Key和Value类型!!!
package com.wh;
import org.apache.hadoop.hive.ql.io.HiveKey;
import org.apache.hadoop.io.BytesWritable;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.Partitioner;
public class MyPartitioner implements Partitioner<HiveKey, BytesWritable> {
//实现每条数据的分区逻辑(这里选择将所有数据发送至0号分区)
@Override
public int getPartition(HiveKey s, BytesWritable s2, int numPartitions) {
return 0;
}
//读取配置信息的方法
@Override
public void configure(JobConf job) {
}
}
3. 打包到集群/opt/hive/lib/目录下
将写好的代码打包上传至集群,放置在Hive的安装路径下的lib目录即可
4. 在Hive中进行测试
4.1 添加jar包
进入Hive的客户端执行
hive (default)> add jar /opt/hive/lib/partition.jar;
4.2 设置Hive中使用自定义的分区器
hive (default)> set hive.mapred.partitioner = com.wh.MyPartitioner;
4.3 修改Reducer数量
hive (default)> set mapreduce.job.reduces=3;
4.4 执行SQL进行测试
测试数据展示
hive (default)> select empno from emp;
OK
empno
7369
7499
7521
7566
7654
7698
7782
7788
7839
7844
7876
7900
7902
7934
使用自定义分区器对empno字段进行分区处理
hive (default)> insert overwrite local directory '/opt/data/distribute-result' select * from emp distribute by deptno sort by empno desc;
4.5 查看结果
-rw-r--r--. 1 atguigu atguigu 707 11月 1 13:13 000000_0
-rw-r--r--. 1 atguigu atguigu 0 11月 1 13:13 000001_0
-rw-r--r--. 1 atguigu atguigu 0 11月 1 13:13 000002_0
发现只有0号分区有数据,自定义Hive分区器完成!!!
来源:oschina
链接:https://my.oschina.net/u/4259850/blog/4816813