我在地图中有一个值,我需要它是减少的第一个值。我可以在hdfs中保存这个值,然后我在setup()中读取它吗? 是否可以在reduce()中的setup()中从hdfs读取文件?
答案 0 :(得分:0)
有多种方法可以做到这一点:
对于选项#1,假设您有一个Text键和Text值从mapper传递给reducer。 而且你知道你的密钥都不能以空格“”开头。所以你可以做的是构造一个特殊的键“”+#,其中#是一个reducer分区id(从0到N-1,其中N是你的reducer的总数)。然后在循环中写入输出键“01”,“02”,“03”,...以及您需要传递给每个reducer的值。 设置自定义partitioner,以便它识别“特殊”键并路由到相应的分区:
int getPartition(Text key, Text value, int numPartitions) {
if (key.toString().startWith(" ") {
//special key
int partId = Integer.parseInt(key.toString().substring(1));
return partId;
} else {
//regular key
return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
}
}
显然,如果你有其他数据类型用于密钥,你仍然可以创造性地提出类似的逻辑。