【问题标题】:Can I use Combiner to compute average in a mapreduce job?我可以使用 Combiner 在 mapreduce 作业中计算平均值吗?
【发布时间】:2018-08-15 07:10:56
【问题描述】:

我想实现一个使用以下架构读取镶木地板文件的 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 类通常应该计算每小时的平均速度。

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

任何帮助将不胜感激。

谢谢:)

【问题讨论】:

    标签: hadoop mapreduce average reducers combiners


    【解决方案1】:

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

    作为输入,组合器将得到(hour, (speed, 1)),作为输出,它应该产生(hour, (sum_speed, num_records))。然后,reducer 可以通过将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))
    

    reducer 会在除法之前再次对它们求和:

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

    (hour, average_speed) 的形式为您解答。

    【讨论】:

    • 非常感谢您的回答,我正在考虑这个解决方案,但是这对 (sum_speed, num_records) 也应该是映射器输出的值,因为组合器和映射器必须具有相同的值据我所知,键/值类型。
    • 对不起,你是对的。我有一段时间没做 MR 了:)。更新了答案。
    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 2014-07-19
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多