我想在我的輸出hadoop mapreduce倒排索引程序中消除重複的文件名。例如,輸出類似 - 事情:DOC1,DOC1,DOC1,DOC2但我希望它像 事情:DOC1,DOC2如何消除hadoop mapreduce中的重複文件名?
回答
要使用最少量的做到這一點更改代碼,只需添加一個if語句來檢查,看看是否要追加的東西已經在toReturn
:
if (!first)
toReturn.append(", ") ;
first = false;
toReturn.append(values.next().toString());
被改爲
String v = values.next().toString()
if (toReturn.indexOf(v) == -1) { // indexOf returns -1 if it is not there
if (!first) {
toReturn.append(", ") ;
}
toReturn.append(v);
first = false
}
上述溶液是有點慢,因爲它具有每一次,看是否該字符串是有遍歷整個字符串。可能最好的方法是使用HashSet
來收集項目,然後將HashSet
中的值合併爲最終輸出字符串。
那麼你想刪除已映射的副本,即你想減少中間值列表到輸出列表沒有重複。我最好的選擇是簡單地在reduce()
方法轉換Iterator<Text>
到Java Set
和遍歷它改變:
while (values.hasNext()) {
if (!first)
toReturn.append(", ") ;
first = false;
toReturn.append(values.next().toString());
}
喜歡的東西:
Set<Text> valueSet = new HashSet<Text>();
while (values.hasNext()) {
valueSet.add(values.next());
}
for(Text value : valueSet) {
if(!first) {
toReturn.append(", ");
}
first = false;
toReturn.append(value.toString());
}
不幸的是,我不知道有什麼好(更簡潔)將Iterator轉換爲Set的方法。
這應該比橙色的解決方案具有更小的時間複雜度,但是會消耗更多的內存。
@Edit:短一點:
Set<Text> valueSet = new HashSet<Text>();
while (values.hasNext()) {
Text next = values.next();
if(!valueSet.contains(next)) {
if(!first) {
toReturn.append(", ");
}
first = false;
toReturn.append(value.toString());
valueSet.add(next);
}
}
包含應(就像補充)固定的時間,所以應該是O(n)的現在。
您的解決方案就是我在回答結束時提出的建議,並且是最佳解決方案。實際上,我們的空間複雜度是相同的,因爲我必須在將結果寫出之前將結果緩存到StringBuffer中。 – 2012-02-07 20:30:18
是的,但我也有那個StringBuilder(因爲這是我們實際返回),但我也有存儲唯一結果的集合。我想我們也可以通過在「while」外觀中添加所有內容並添加一個簡單的if/else檢查來優化它。問題是什麼會更快:如果在while循環的每一步或第二個for循環中多加一個。 – 2012-02-07 20:37:22
在Hadoop的宏偉計劃中可能無所謂:) – 2012-02-07 20:40:50
- 1. 在Hadoop的MapReduce中使用關係名/表名/文件名
- 2. 的Hadoop MapReduce的計劃刪除重複記錄
- 3. 使用hadoop mapreduce確定重複數據刪除的鍵值對
- 4. Hadoop中的MapReduce
- 5. 比較Hadoop MapReduce中的兩個文件
- 6. hadoop mapreduce中單獨的輸出文件
- 7. 消除XSLT中的重複文件名稱
- 8. 消除重複名稱
- 9. 如何消除文件中的重複行:python
- 10. 如何消除rails erb文件中的重複代碼
- 11. 如何消除MySQL中的重複行?
- 12. 我如何消除gridview中的重複?
- 13. 如何消除sql中的重複項?
- 14. 重命名文件中的Hadoop
- 15. 如何跳過閱讀hadoop中的文件頭mapreduce
- 16. 如何過濾hadoop mapreduce中文件的記錄值?
- 17. 如何消除Webmethods中文檔列表中的重複文檔?
- 18. mapreduce中的reducers hadoop
- 19. Hadoop MapReduce中的DataJoins
- 20. 的Hadoop MapReduce的多個輸入文件
- 21. LINQ到查找和消除重複的文件名
- 22. 消除來自hadoop中映射器的重複鍵/值對
- 23. 將MapReduce作業的部分0000文件命名爲hadoop中的輸入文件
- 24. 如何通過MapReduce刪除MongoDB中的重複記錄?
- 25. Hadoop MapReduce與已排序的文件
- 26. hadoop mapreduce
- 27. 你如何使用MapReduce/Hadoop?
- 28. 識別文件夾中用於處理文件的擴展名使用hadoop mapreduce
- 29. 刪除重複的文件名
- 30. Hadoop中的重複數據刪除
非常感謝你的魅力! – James 2012-02-07 19:57:50