gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:47:46 25 4
gpt4 key购买 nike

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

item1 tag1  
item2 tag1
item3 tag2
item4 tag1
item5 tag2

我的 map 函数创建了一个 <tag, item>对,因此reducer接收到 <tag, List<item>>作为其输入。我的目标是使 reducer 的输出为:
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);
}
}
}

有没有一种替代的或更有效的方式来实现呢?
我不想将每个列表复制到内存中。

我一直在尝试提出一些创意,例如使用另一个map-reduce步骤,但是似乎找不到有效的方法。

谢谢!

最佳答案

reducer确实获取了所有这些数据,但是实际上将这些数据写入磁盘,并且仅当您通过值的Iteratable进行迭代时才将其带入内存。实际上,该迭代返回的对象将针对每个值重用:在将对象交给您之前,只需替换字段和其他状态。

这意味着您必须显式复制值对象,以便同时将所有值对象存储在内存中。

当我查看您的代码时,似乎您没有将项目对保存在内存中。您正在直接写出项目对,因此应该不错。

关于java - 在hadoop中创建所有成对的值列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47229642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com