2016-05-29 4 views
1

こんにちは私はhadoopフレームワークを使ってjavaでfacebookのようなプログラムを実装しています(これは初めてです)。reduce関数のKEYとしての文字列のペア - HADOOP


クリスティーナビル、ジェームズ、ニック、ジェシカ
ジェームズ・クリスティーナ、メアリー、トビー、ニック
...

:主なアイデアは、私は、入力はこのように.txtファイルがあるということです

1番目はユーザーで、カンマ区切りは友人です。マップ機能で


私は、ファイルの各行をスキャンし

クリスティーナビル
クリスティーナ・ジェームズとなります

のような彼の友人のそれぞれをユーザに発します(Christina,[Bill,James,..]) ...

私の割り当ての説明ではReduce関数が の2人のユーザーのタプルをキーとして受け取った場合、その両方の友人の後に、 のものが数えられ、数字が の5以上の数値に等しいかそれ以上の場合、珍しい友人の を提案することができます。どのようにして正確に1組のユーザーをreduce関数に渡すのですか?私はreduce関数の入力がmap関数の出力と同じでなければならないと考えました。私はこれをコーディングし始めましたが、これは正しいアプローチではないと思います。何か案は?あなたがcustom record readerを実装することができるかどう


public class ReduceFunction<KEY> extends Reducer<KEY,Text,KEY,Text> { 
private Text suggestedFriend = new Text(); 

public void reduce(KEY key1,KEY key2, Iterable<Text> value1,Iterable<Text> value2,Context context){ 
}} 
+0

あなたの割り当てがうまく理解できれば、マップとシャッフルとソート後に取得する2行のグループをスキャンする必要があります**(キーカップル、[共通リスト]、[珍しいリスト])** –

+0

実際には...また、一度に1行ずつファイルをスキャンする必要があることを指定しています。マップ機能では、各自の友達と一緒にユーザーを送信する必要があります。 –

答えて

0

マップフェーズの出力は、実際には、フェーズの入力と同じタイプである必要があります。つまり、削減フェーズの入力が必要な場合は、マッパーを変更する必要があります。

発想は単純です:あなたは、ちょうどここであなたが例えば、使用して、ユーザーの名前を連結し、Textキーを使用することができ、

map(user u,friends F): 
for each f in F do 
    emit (u-f, F\f) 

reduce(userPair u1-u2, friends F1,F2): 
#commonFriends = |F1 intersection F2| 

は、このロジックを実装するには、「 - 」、それらの間の文字。

各縮小方法では、各ユーザーが入力データに一度表示されると仮定して、2つの友だちリストのみを受け取ることに注意してください。次に、2つのリストを比較して、友人の共通名を求めなければなりません。

+0

ありがとう、私はそれを試してみる.1つの質問:F/fとは何ですか? –

+0

@ K.Moulよろしくお願いします。 '\'は設定された相違を示します。 F \ {f}(実際には)あなたが鍵に入れた友人fを除いて、すべての友人Fを意味します。代わりに、Fをそのまま保つこともできます。 – vefthym

0

チェックは、mapper classに入力ファイルから一度に2つのレコードを読み取ります。そして、マッパークラスからcontext.write(outkey, NullWritable.get());を出してください。今度はreducer classで、マッパークラスのキー(outkey)として2つのレコードを処理する必要があります。がんばろう !

関連する問題