如何在 for 循环中迭代文本并在 MapReduce() 中查找特定文本的计数

How to iterate among text in the for loop and find count of a particular text in MapReduce()

所以这里有一段关于特定数据集的 Reduce() 代码,它有一堆指定 'key' 和指定指定人员的薪水 'value'

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' 列的城市名称和 text 格式的区域类型(不是像以前的数据集)示例(住宅或木材等)按列给出

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() 中实现的是,我想逐列迭代所有这些文本值,并扫描每个文本并检查它是否显示为 "Residential",如果是则增加伯爵。但是方法 get() 对于文本类型是未定义的。 (我想我可以很聪明,随便用这个数据集的文本替换 int)显然我对在这些文本列中迭代的知识非常少。有人会帮我解决这个问题吗?

尝试用这个替换你的 for 循环

for (Text val : values) {
   if (val.toString().equals("Residential")){
        count++;
   }
}

由于您的值为文本,因此您需要使用等号来将其与 "Residential" 匹配。并且 .get() 未为文本定义。

希望这是你需要的