我的数据结构如下:
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
编辑:幼稚的方法/intuition
我认为完成它的一种方法是使用映射器将每行映射到同一键,然后在还原器
中映射到同一键映射器的结果:
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]);
}
}
}
但这似乎疯狂效率低下
我只会得到密钥,然后做一个嵌套以创建结果:
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))
}
}
您可能至少有三个选择来实现这一目标:
-
WholeFileInputFormat
您可以编写自定义输入格式,该格式将整个文件作为记录。您可以在Tom Whites代码中为他的Hadoop书中的代码看到一个例子。
- 在映射器中保持状态
当每个记录进入映射器时,每个迭代都会生成新组合。或更简单的方法是将记录添加到列表中,一旦阅读了所有记录,请使用映射器的cleanup()
方法生成所有组合。
- 使用还原器
您可以使用公共密钥从映射器发射每个条目,所有值将作为您可以迭代的值列表输入缩写。然后,您需要具有逻辑来生成所有组合。
问题确实在于,如果您有多个文件,因此多个并行运行的映射器,1
和2
不起作用。只要唯一的键将适合内存,3
就可以工作。