我可以使用Combiner在mapreduce作业中计算平均值吗?

时间:2018-03-07 08:49:51

标签: hadoop mapreduce average reducers combiners

我想实现一个mapreduce作业,该作业使用以下模式读取镶木地板文件:

{
  optional int96 dropoff_datetime;
  optional float dropoff_latitude;
  optional float dropoff_longitude;
  optional int32 dropoff_taxizone_id;
  optional float ehail_fee;
  optional float extra;
  optional float fare_amount;
  optional float improvement_surcharge;
  optional float mta_tax;
  optional int32 passenger_count;
  optional binary payment_type (UTF8);
  optional int96 pickup_datetime;
  optional float pickup_latitude;
  optional float pickup_longitude;
  optional int32 pickup_taxizone_id;
  optional int32 rate_code_id;
  optional binary store_and_fwd_flag (UTF8);
  optional float tip_amount;
  optional float tolls_amount;
  optional float total_amount;
  optional float trip_distance;
  optional binary trip_type (UTF8);
  optional binary vendor_id (UTF8);
  required int64 trip_id;
}

该工作的主要目的是计算每天每小时(0-> 23)的出行中的出租车的平均速度。

我的 Mapper 课程计算每个取件时间的速度,以便提供以下几个 (小时,速度)

Reducer 类通常应计算每小时的平均速度。

但是我想知道我是否可以使用组合器类来促进数据处理,因为我了解到组合器类只能用于交换和关联操作,而平均值不是这样吗?

任何帮助将不胜感激。

谢谢:)

1 个答案:

答案 0 :(得分:2)

组合器可以帮助计算平均值。您基本上想要使用组合器为您提供可在减速器中使用的运行总计来计算平均值。

作为输入,组合器将获得(hour, (speed, 1)),并且作为输出,它应该产生(hour, (sum_speed, num_records))。然后,减速器可以将sum_speed除以num_records来计算每小时的平均值。

例如,如果组合器1收到输入:

(1, (50, 1))
(1, (20, 1))
(1, (10, 1))
(23, (16, 1))

然后输出:

(1, (80, 3))
(23, (16, 1))

如果组合器2收到输入:

(1, (20, 1))
(23, (40, 1))

然后输出:

(1, (20, 1))
(23, (40, 1))

然后减速器会在分割之前再次求和:

(1, (80+20, 3+1)) = (1, (100, 4)) = (1, 25) 
(23, (16+40, 1+1)) = (23, (56, 2)) = (23, 28)

(hour, average_speed)

的形式向您提供答案