Hive之自定义分区、多维度分析函数

298 阅读2分钟

自定义分区

应用场景

需要将统计结果按照条件输出到不同的文件中(即分区中)

默认分区规则

根据key的hashCode对ReduceTasks个数取模得到的,用户没法控制哪个key存储到哪个分区。

自定义分区步骤

假设按照手机号分区,如手机号136、137、138、139开头都分别放到一个独立的4个文件中,其他开头的放到一个文件中。

1. 自定义类继承Partitioner,重写getPartition()方法

package com.atguigu.mr.flowsum;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

public class ProvincePartitioner extends Partitioner<Text, FlowBean> {

	@Override
	public int getPartition(Text key, FlowBean value, int numPartitions) {
		//key是手机号,value是流量信息
		//获取手机号前三位
		String prePhoneNum = key.toString().substring(0, 3);
		int partition = 4;
		
		if ("136".equals(prePhoneNum)) {
			partition = 0;
		}else if ("137".equals(prePhoneNum)) {
			partition = 1;
			
		}else if ("138".equals(prePhoneNum)) {
			partition = 2;
			
		}else if ("139".equals(prePhoneNum)) {
			partition = 3;
			
		}else {
			partition = 4;
		}
		return partition;
	}
}

2. 打包到集群/opt/hive/lib/目录下

将写好的代码打包上传至集群,放置在Hive的安装路径下的lib目录即可

3. 在Hive中进行测试

3.1 添加jar包

hive (default)> add jar /opt/hive/lib/partition.jar;

3.2 设置Hive中使用自定义的分区器

hive (default)> set hive.mapred.partitioner = com.atguigu.mr.flowsum.ProvincePartitioner;

3.3 修改Reducer数量

hive (default)> set mapreduce.job.reduces=5;

3.4 执行sql测试

使用distribute by 进行测试

3.5 查看结果

136、137、138、139开头都分别放到一个独立的4个文件中,其他开头的放到一个文件中。

参考

多维度分析函数

当需要多维度分析的时候,比如按性别统计,按部门和性别统计,按地区和性别统计都需要的时候,按照基本方法可以使用多个goup by 再union,这时候就可以考虑用多维度分析函数

  • Grouping Sets:可以自定义维度组合
select dept_name,addr,sex,count(*) ct 
    from test 
    group by dept_name,addr,sex 
    grouping sets((sex),(dept_name,sex),(addr,sex))
  • With Cube:多个维度所有组合都要求聚合的时候可以考虑
select dept_name,addr,sex,count(*) ct 
    from test 
    group by dept_name,addr,sex 
    with cube;
  • With RollUp:当需要上卷操作的时候可以使用
SELECT a,b,c,SUM(d) GROUP BY a, b, c WITH ROLLUP
-- 相当于
GROUP BY a, b, c GROUPING SETS ( (a, b, c), (a, b), (a), ())

参考