【发布时间】:2017-06-23 05:03:48
【问题描述】:
我的数据结构如下:
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
编辑:天真的方法/直觉
我认为实现它的一种方法是使用映射器将每一行映射到同一个键,然后在减速器中
映射器的结果:
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]);
}
}
}
但这似乎是疯狂的低效
【问题讨论】:
-
这个问题符合 MapReduce 生成的排列类别。见stackoverflow.com/questions/6535878/permutations-with-mapreduce。
-
更糟糕的是,您编写 reduce 的方式无法正常工作,因为您无法像那样访问
values。 Hadoop 不允许您访问值列表,您可以遍历值一次。如果你想做更多,你需要自己将它们存储在内存中。