0

User、Company、Visit という 3 つの基本モデルがあるとします。ユーザーが会社に行くたびに、訪問がこの形式で記録されます(user_id, company_id, visit_date)

会社の訪問間の平均時間を計算できるようにしたいと考えています。全体的な訪問数ではなく、具体的には、顧客の 1 人が店舗に戻るまでの平均待ち時間です。

たとえば、火曜日、水曜日、金曜日に 1 人のユーザーがアクセスした場合、1 日の「ギャップ」と 2 日の 1 つの「ギャップ」が得られます => (1, 2)。別のユーザーが月曜日と金曜日にアクセスした場合、4 日間のギャップが 1 つ発生します => (4)。3 番目のユーザーが 1 回だけ訪問した場合、そのユーザーは考慮されません。会社のユーザー訪問間の平均時間は (1 + 2 + 4) / 3 = 2.333 日です。

何千ものユーザー、タップ、企業があり、それぞれの企業について 1 つの数字を計算したい場合、どうすればよいでしょうか? 以前は基本的な MapReduce アプリケーションしか実行したことがなく、これを実行するために Map と Reduce の手順がどうなるかわかりません。疑似コードで MapReduce を理解するのを手伝ってくれる人はいますか? または、合理的に実行できる分散計算の他の方法はありますか? 記録のために、毎晩データベースでこの操作を実行したいと思います。

4

1 に答える 1

0

過度に単純化されたアプローチは、2 つのジョブ ステップを持つことです。

最初のジョブ ステップには、「company:user」および「visit_date」の形式でキー値を書き込むマッパーがあります。上記の例では、マッパーは次のように記述します。

"user1:companyA" -> "2012/07/16"
"user1:comapnyA" -> "2012/07/17"
"user1:comapnyA" -> "2012/07/19"
"user2:comapnyA" -> "2012/07/15"
"user2:comapnyA" -> "2012/07/19"
...

これは、レデューサーへの各呼び出しが、1 人のユーザーによるすべての訪問を 1 つの会社に渡すことを意味します。つまり、レデューサーへの 1 回の呼び出しで次のように渡されます。

"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19}

別の呼び出しが渡されます。

"user2:companyA" -> {2012/07/15, 2012/07/19}

一連の日付 (Iterable 値として渡される) は、並べ替え、ギャップを把握し、各ギャップのレコードを "company" と "gap" の形式のキーと値のペアとして簡単に管理できると想定しています。 . たとえば、渡された場合:

"user1:companyA" -> {2012/07/16, 2012/07/17, 2012/07/19}

最初のジョブのレデューサーはコンテキストに書き込みます:

"companyA" -> 1
"compnayA" -> 2

2 番目のジョブには、会社/ギャップ情報をレデューサーに渡すだけのパススルー マッパーがあります。レデューサーへの各呼び出しは、特定の会社のギャップの Iterable 値を提供します。データを反復処理して平均を生成し、キーと値のペアを「company」と「average_gap」の形式で書き込みます。

元の一連の訪問が大きくなりすぎた場合は、hadoop にカスタム コンパレータを使用して並べ替えを行わせることについてお話しできます。

于 2012-07-18T22:06:44.243 に答える