java—在hadoop中创建所有成对的值列表

2ekbmq32  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(240)

我有一个小的map reduce程序,我正在为hadoop编写,这个程序的一个元素是创建一个列表的所有对。例如,如果程序的输入是:

item1 tag1  
item2 tag1  
item3 tag2  
item4 tag1  
item5 tag2

我的Map函数创建一个 <tag, item> 对,所以减速机接收 <tag, List<item>> 作为它的输入。我的目标是使减速器的输出为:

item1-item2 tag1  
item1-item4 tag1  
item2-item4 tag1  
item3-item5 tag2

所以本质上,对于每个值列表,创建所有可能的对,并使每个对成为键。
我找到了一个可行的解决方案,但它依赖于将列表复制到内存中并对其进行迭代。这可能是个问题,因为我的数据集可能非常大:

public void reduce(Text key, Iterable<Text> values, Context context) 
                         throws IOException, InterruptedException {

    List<String> list = new ArrayList<String>();
    for (Text t : values) {
        list.add(t.toString());
    }
    for (int i=0; i<list.size()-1; i++) {
        for (int j=i+1; j<list.size(); j++) {
            out.set(list.get(i) + "-" + list.get(j))
            context.write(out, one);
        }
    }
}

在hadoop中有没有其他的或者更有效的方法呢?
我不想把每个列表都复制到内存中。
我一直试图想出一些有创意的方法,比如使用另一个map reduce步骤,但似乎找不到有效的方法。
谢谢您!

kqlmhetl

kqlmhetl1#

reducer确实获取了所有这些数据,但这些数据实际上是写入磁盘的,并且只有在遍历可迭代的值时才会被带到内存中。事实上,该迭代返回的对象对于每个值都是重用的:在将对象交给您之前,只需替换字段和其他状态。
这意味着您必须显式地复制value对象,以便在内存中同时拥有所有value对象。
当我查看您的代码时,似乎您没有将项对保存在内存中。你是直接写出项目对,所以你应该是好的。

相关问题