我的数据结构如下:
A, 23
B, 324235
C, 123
D, 213
示例字数映射器具有以下映射函数签名:
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
核心问题:
Text value
只是输入文件中的一行或单个键。如何一次访问所有密钥?看起来线条(以及它们后期缩减的扩展)不知道其他输入线
使用示例:
我希望输出所有ID的组合,这需要密钥“彼此了解”
AB
AC
AD
BC
BD
CD
编辑:天真的方法/直觉
实现它的一种方法我相信是使用映射器来投影每一行以映射到同一个键,然后在reducer中
Mapper的结果:
CONST_KEY, A
CONST_KEY, B
CONST_KEY, C
CONST_KEY, D
减速机:
public void reduce(Text key, Iterable<Text> values, Context context){
//PSEUDO CODE
for(int i = 0; i < values.length; i++){
for(int j = i+1; j < values.length; j++){
String combo = concat(values[i], values[j]);
}
}
}
但这看起来很疯狂
答案 0 :(得分:0)
我只是获取键集,然后执行嵌套for循环来创建结果:
List<String> keys = new ArrayList<String>(yourmap.keySet());
List<String> results= new ArrayList<String>();
for(int i = 0; i < keys.length - 1; i++)
for (int j = i+1; j < keys.length; j++) {
results.add(keys.get(i) + keys.get(j))
}
}
答案 1 :(得分:0)
您可能至少有三种选择来实现这一目标:
WholeFileInputFormat
您可以编写自定义输入格式,将整个文件作为记录。你可以在Tom Whites代码中看到他的Hadoop书here的一个例子。
当每条记录进入Mapper时,每次迭代都会生成新的组合。或者更简单的方法是将记录添加到列表中,一旦读取了所有记录,就使用Mapper的cleanup()
方法生成所有组合。
您可以使用公共密钥从Mapper中发出每个条目,并且所有值都将输入reduce作为您可以迭代的值列表。然后,您需要有逻辑来生成所有组合。
问题是,如果您有多个文件,因此并行运行多个映射器,1
和2
不起作用。只要唯一的一组键适合内存,3
就会起作用。