簡體   English   中英

我可以使用組合器來計算 mapreduce 作業中的平均值嗎?

[英]Can I use Combiner to compute average in a mapreduce job?

我想實現一個 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類計算每個接送小時的速度,因此它提供以下幾個(hour, speed)

Reducer類通常應該計算每小時的平均速度。

但是我想知道我是否可以使用組合器類來促進數據處理,因為我了解到組合器類只能用於交換和關聯操作,而平均情況並非如此,對嗎?

任何幫助將不勝感激。

謝謝 :)

組合器可以幫助計算平均值。 您基本上想使用組合器為您提供一個運行總數,您可以在減速器中使用它來計算平均值。

作為輸入,組合器將獲得(hour, (speed, 1)) ,作為輸出,它應該產生(hour, (sum_speed, num_records)) 然后,reducer 可以通過將sum_speed除以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)的形式為您提供答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM