所以这里有一段关于特定数据集的Reduce()代码,其中有一堆指定为"关键",将特定命名人员的薪水指定为"值"
public static class ReduceEmployee extends
Reducer<Text, IntWritable, Text, IntWritable>
{
public void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException, InterruptedException {
int sum = 0;
for (IntWritable val : values) {
sum += val.get();
}
context.write(key, new IntWritable(sum));
}
}
如果我理解正确,它的作用是,它有一个公共键(一堆名称,如按列给出的经理、管家),以及一堆整数(薪水)作为按列给出的值,这些整数中的每一个都被迭代并添加到 0 以获得特定键的总工资(将它们映射到类似的键后)
我得到了另一个数据集,其中有一堆城市名称作为"key"列,并且文本格式的区域类型(不像以前的数据集那样是整数工资)示例(住宅或木材等)按列给出
public static class ReduceEmployee extends
Reducer<Text, Text, Text, IntWritable> {
public void reduce(Text key, Iterable<Text> values,
Context context) throws IOException, InterruptedException {
int count = 0;
Text r;
for (Text val : values) {
r = val.get();
if (r=="Residential")
{
count++;
}
}
context.write(key, new IntWritable(count));
}
}
我想在我的 Reduce() 中实现的是,我想逐列在所有这些文本值之间迭代,并扫描每个文本并检查它是否读作"住宅",如果是这样,则增加计数。但是 get() 方法未为文本类型定义。(我想我可以很聪明,随便用这个数据集的文本替换 int)显然,我在这些文本列中迭代的知识非常少。有人会帮助我并给我一个关于我必须如何解决这个问题的解决方案吗?
尝试用这个替换你的 for 循环
for (Text val : values) {
if (val.toString().equals("Residential")){
count++;
}
}
由于您的值是文本,因此您需要使用等于将其与"住宅"匹配。 并且 .get() 未定义文本。
希望这是你需要的