我需要使用復制連接來實作一個簡單的內部連接,但我發現有關如何執行此操作的資訊量少得驚人。
我有一個 <1gb 的資料集,看起來像
A C
A D
B Y
C D
然后我的輸入檔案看起來非常相似
C Z
B I
A B
D Z
C O
我想對復制的資料集的第一列和資料集的第二列進行內部連接,以便得到類似的結果
A C Z
A C O
A D Z
C D Z
復制的資料集或主資料集都不會有重復的行
我知道我需要將減速器的數量設定為 0,并且我需要在 MAP 的設定階段讀取復制的資料集
但我不知道如何讀取它,或者在哪里存盤復制的資料集,也不知道讀取檔案的資料結構,或者如何進行連接。
我看到了一些使用哈希映射的教程,但這不起作用,因為重復的鍵會相互覆寫。
uj5u.com熱心網友回復:
這是我想出的解決方案。我想在所有映射器之間復制的檔案已加載到我的驅動程式代碼中的分布式快取中
DistributedCache.addCacheFile(new Path(args[3]).toUri(), job.getConfiguration());
在我的映射器中,我宣告了一個型別的哈希映射
Map<String, List<String>> adjacencyList = new HashMap<>();
在我的映射器的設定階段,我從分布式快取中讀取了所有檔案
Path[] pathLength1 = DistributedCache.getLocalCacheFiles(context.getConfiguration());
if(pathLength1 != null && pathLength1.length > 0) {
for(Path file : pathLength1) {
readFile(file);
}
}
讀取檔案的代碼如下,我可以通過將相同鍵的所有值附加到自己來繞過相互覆寫的鍵
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath.toString()));
String stopWord = null;
while((stopWord = bufferedReader.readLine()) != null) {
String[] splited = stopWord.split("\\s ");
List<String> temp = new ArrayList<String>();
if(adjacencyList.containsKey(splited[0])){
temp = adjacencyList.get(splited[0]);
}
temp.add(splited[1]);
adjacencyList.put(splited[0], temp);
}
然后在數學階段,當我逐行讀取我的另一個檔案時,我可以檢查我的哈希映射是否存在鍵并加入它。
無需減速機
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316022.html
