首页 > 解决方案 > Hadoop MapReduce 复制连接

问题描述

我需要使用复制连接来实现一个简单的内部连接,但我发现关于如何做到这一点的信息很少。

我有一个 < 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

复制的数据集或主数据集都不会有重复的行

我知道我需要将 reducer 的数量设置为 0,并且我需要在 MAP 的设置阶段读取复制的数据集

但我不知道如何读取它,或者在哪里存储复制的数据集,也不知道读取文件的数据结构,或者如何进行连接。

我看到了一些使用哈希映射的教程,但这不起作用,因为重复的键会相互覆盖。

标签: javahadoopmapreduce

解决方案


这是我想出的解决方案。我想在所有映射器中复制的文件被加载到我的驱动程序代码中的分布式缓存中

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);
        }

然后在数学阶段,当我逐行读取我的其他文件时,我可以检查我的哈希映射是否存在密钥并加入。

无需减速机


推荐阅读