在Hadoop中进行数据分组和聚合的主要方式是:
1、 使用Hive的GROUP BY实现分组聚合:
- 对SELECT查询的结果按指定列进行分组。
- 支持COUNT、SUM、AVG、MAX、MIN等聚合函数进行计算。
- 底层依赖HDFS数据的Hash Partitioner进行分区与排序。
2、 在MapReduce中自定义Partitioner进行分组:
- 在Partitioner中按指定列对数据进行哈希分区。
- 在Reducer中接收相同分组的数据进行聚合计算。
- 这需要编写Partitioner与Reducer逻辑。
3、 使用CombineFileInputFormat进行小文件聚合:
- 使用CombineFileInputFormat以小文件为单位进行输入数据的合并。
- 在Reduce端再对合并后的大文件进行分组与聚合操作。
- 这可以减少Map端的处理量以提高效率。
4、 在 MySQL/Hive/Impala中使用GROUP BY 进行分组聚合:
- 使用GROUP BY对指定列进行分组。
- 使用聚合函数如COUNT、SUM、AVG等进行计算。
- 这需要数据已入库至MySQL/Hive/Impala等系统中。
- 支持多列组合进行分组,但性能会有一定损失。
5、 Hive数据分组聚合示例:
- 创建输入表:
CREATE TABLE students (
grade STRING,
score INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
- 加载数据:
LOAD DATA INPATH '/data/students、txt' INTO TABLE students;
- 按grade分组并计算avg(score)
SELECT grade, AVG(score)
FROM students
GROUP BY grade;
- 结果返回grade与对应的平均分。
数据分组和聚合的主要作用是:
1、 发现数据之间的内在联系与规律。
2、 汇总与整理大量详细数据。
3、 挖掘数据的组键统计特征与分布规律。
4、 支持业务监控、报表与可视化数据分析。
来看一些简单示例:
1、 Hive使用GROUP BY与聚合函数:
- 创建如下表:
CREATE TABLE students (
grade STRING,
score INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';
- 按grade进行分组并计算平均分:
SELECT grade, AVG(score)
FROM students
GROUP BY grade;
2、 自定义MapReduce作业进行分组聚合:
- 编写Partitioner对grade列哈希分区:
public class AvgReducer extends
Reducer<Text, IntWritable, Text, IntWritable> {
private IntWritable result = new IntWritable();
@Override
public void reduce(Text grade, Iterable<IntWritable> scores,
Context context)
throws IOException, InterruptedException {
int sum = 0;
int count = 0;
for (IntWritable score : scores) {
sum += score、get();
count++;
}
result、set(sum / count);
context、write(grade, result);
}
}
- 设置MapReduce作业使用GradePartitioner与AvgReducer
- 运行作业实现对grade进行分组并计算平均分
所以通过Hive SQL、自定义MapReduce与Spark SQL等工具,我们可以高效地对数据进行汇总、统计与监控,找出数据之间的关联与规律,为业务决策提供有价值的参考依据。