Hive自定义分区器流程

家住魔仙堡 提交于 2020-12-20 23:03:54

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分区器完成!!!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!