2016-12-06 6 views
0

マップリダクションで以下の処理を行うアルゴリズムを試しています。私はたくさんのオブジェクトと所有者のユーザーIDを受け取ります。言い換えれば、私はペアの束を受け取る:スレッシュホールドフィルタリングによるコレクションのグループ化

(object, uid) 

私はcountは、オブジェクトがリスト内に出現する回数を指しペア(object,count)のリスト、で終わるしたいです。注意点は、私たちは次のようにすべてをフィルタリングする必要があるだろうということです:我々は唯一のオブジェクトは、少なくともn異なるUIDのために繰り返されるように、オブジェクトのペアが含まれている必要があり

  1. 繰り返し回数の合計が少なくともm個になるようにオブジェクトを含める必要があります。

オブジェクトとユーザーはすべて整数で表されます。問題は、各(object,uid)のペアを(object, 1)に変換し、次に2番目の整数を合計することでそれらを一緒に減らすことは些細なことです。次に、(2)のしきい値に達していないすべてのものをフィルタリングすることができました。しかし、この時点では、(1)でフィルタリングするのに必要な情報が失われてしまいました。これは私がこれにどのように組み込むべきかわかりません。誰でも何か提案がありますか?

答えて

0

最も簡単で最も自然な方法は、2つのMRジョブを順番に実行することです。最初の仕事の目標は、各objectがそれぞれuidによってどれくらい所有されているかを数えることです。結果はトリプレット(object,uid,count)です。 uidフィールドはデバッグ目的のみです.2番目のジョブでは必須ではありません。第二のジョブグループのトリプレットはobjectです。所有しているどのくらいの時間objectのオブジェクトの異なるuid秒の

  1. 数(受信トリプレットの数)
  2. 総数(countフィールドの合計):各の末尾に()の呼び出し、あなたが知っているを減らします

これで、両方のフィルタを適用することができます。


シングルジョブの設定も可能ですが、それはsetSortComparatorClass()setGroupingComparatorClass()setPartitionerClass()で少し低いレベルでのジョブに操作が必要です。キーのみのobjectフィールドを使用して

  1. パーティション分割クラスパーティションキー:アイデアは、マップ()の両方objectuidフィールドを含む複合キー、値が全く使用されない(NullWritable)を放出すべきであるということです。これにより、同じobjectのすべてのレコードが同じ削減タスクに移行することが保証されます。
  2. SortComparatorクラスは、最初にobjectフィールドを比較し、一致する場合はuidフィールドに実装されます。
  3. GroupingComparatorClassは、比較のためにobjectフィールドのみを使用します。結果は

、単一の入力は、次のようになりますタスクを減らす:あなたが見ることができるように

object1 uid1 
object1 uid2 
object1 uid2 
object1 uid2 
object1 uid5 
object1 uid6 
object1 uid6 
------------ <- boundary of call to reduce 
object7 uid1 
object7 uid1 
object7 uid5 
------------- <-- boundary of call to reduce() 
object9 uid3 

は、UIDのは厳密に)(減らすために、各コールの内側に注文されている、あなたは両方をカウントすることを可能にします異なる数の異なるUIDを同時に使用する。

関連する問題