2016-01-06 128 views
2

我使用下面的示例數據來學習hadoop mapreduce。例如 它是追隨者和followee的數據。hadoop mapreduce反之亦然

Follower,followee 
    a,b 
    a,c 
    a,d 
    c,b 
    b,d 
    d,a 
    b,c 
    b,e 
    e,f 

就像是繼B,A是繼C等....

我試圖操縱數據和得到的結果,例如,如果是以下B和B是也跟隨一個然後a,b應該是輸出txt文件中的結果。我是新來映射減少,並試圖找到一種方式,以便我可以得到下面的結果。

a,d 
c,b 

回答

3

您可以使用一招。

訣竅是通過鍵將減速器以這樣的方式即,上述(a,d)和(d,α)具有相同的密鑰,並在同一減速結束:

當(一,d)來自:

'a' < 'd', hence emit: 
key => a,d 
value => a,d 

當(d,α)來了:總是形成

'd' > 'a', hence emit: 
key => a,d 
value => d,a 

鍵以這樣的方式,較低的字母而來的較高的字母之前。所以對於這兩種記錄,關鍵是「一,d」

所以映射器的輸出將是:

Record: a,b 
Key = a,b Value = a,b 

Record: a,c 
Key = a,c Value = a,c 

Record: a,d 
Key = a,d Value = a,d 

Record: c,b 
Key = b,c Value = c,b 

Record: b,d 
Key = b,d Value = b,d 

Record: d,a 
Key = a,d Value = d,a 

Record: b,c 
Key = b,c Value = b,c 

Record: b,e 
Key = b,e Value = b,e 

Record: e,f 
Key = e,f Value = e,f 

現在,在減速中的記錄將按照以下順序到達:

Record 1: 
    Key = a,b Value = a,b 

Record 2: 
    Key = a,c Value = a,c 

Record 3: 
    Key = a,d Value = a,d 
    Key = a,d Value = d,a 

Record 4: 
    Key = b,c Value = c,b 
    Key = b,c Value = b,c 

Record 5: 
    Key = b,d Value = b,d 

Record 6: 
    Key = b,e Value = b,e 

Record 7: 
    Key = e,f Value = e,f 

因此,在減速機,你可以解析記錄3和4:

Record 3: 
    Key = a,d Value = a,d 
    Key = a,d Value = d,a 

Record 4: 
    Key = b,c Value = c,b 
    Key = b,c Value = b,c 

因此,輸出將是:

a,d 
c,b 

這個邏輯會的工作,即使你有名字的,而不是字母。 例如你需要使用下面的邏輯在映射器側(其中S1是第一個字符串和s2是第二個字符串):

String key = ""; 
int compare = s1.compareToIgnoreCase(s2); 
if(compare >= 0) 
    key = s1 + "," + s2; 
else 
    key = s2 + "," + s1; 

所以,如果您有:

String s1 = "Stack"; 
String s2 = "Overflow"; 

的關鍵是:

Stack,Overflow 

同樣,如果您有:

s1 = "Overflow"; 
s2 = "Stack"; 

仍然,關鍵將是:

Stack,Overflow 
+0

大@Manjunath。最佳答案.. – Thanga

+1

我如何實現它,如果我有一些名稱,而不是字母? @manjunath –

+0

它會工作相同。只需要根據字母命令名稱。 –