不看你的代碼,沒錯,這就是通常很容易在MapReduce的做;這裏最好的情況是如果你有許多用戶(誰不想這麼做?),並且每個用戶的交互次數有限。
抽象地,輸入數據可能會是這個樣子:
File 1:
1, 200, "/resource", "{metadata: [1,2,3]}"
File 2:
2, 200, "/resource", "{metadata: [4,5,6]}"
1, 200, "/resource", "{metadata: [7,8,9]}"
如果這僅僅是一個記錄的用戶,HTTP狀態,路徑/資源,和一些元數據。這裏最好的辦法就是確實只關注你的映射器清理數據,將其轉化爲可以使用的格式,並將用戶ID和其他所有內容(很可能還包括用戶標識)作爲鍵/值對發佈。
我不是非常熟悉的Hadoop流,而是根據文件:By default, the prefix of a line up to the first tab character is the key,
所以這可能看起來像:
1\t1, 200, "/resource", "{metadata: [7,8,9]}"
注意,1
是重複的,因爲你可能想使用它的輸出,而不只是作爲洗牌的一部分。這就是從單一的映射器處理File 1
和File 2
處理轉入somethig更像:
1:
1, 200, "/resource", "{metadata: [1,2,3]}"
1, 200, "/resource", "{metadata: [7,8,9]}"
2:
2, 200, "/resource", "{metadata: [4,5,6]}"
正如你所看到的,我們已經基本上完成了我們的每用戶grep的!這只是做我們最後的轉變的問題,可能包括一種排序(因爲這基本上是時間序列數據)。這就是爲什麼我早些時候說過,如果你有很多用戶和有限的用戶交互,這對你來說會更好。排序(或通過網絡發送!)每個用戶的MB數量不會特別快(儘管可能仍然比替代方案更快)。
總之,它取決於規模和用例,但通常情況下,這是一個非常適合總體映射/減少的問題。