自定义分区
应用场景
需要将统计结果按照条件输出到不同的文件中(即分区中)
默认分区规则
根据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), ())