[英]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.