Hadoop中如何进行数据的分组和聚合?代码举例讲解

在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等工具,我们可以高效地对数据进行汇总、统计与监控,找出数据之间的关联与规律,为业务决策提供有价值的参考依据。