我是hadoop的新手。我有数据:https://data.ny.gov/Economic-Development/Quarterly-Census-of-Employment-and-Wages-Annual-Da/shc7-xcbw的NAICS,面积和工资。

我的目标是在每个NAICS中找到一个区域,在该区域中,使用Java hadoop的工资总和是统计数据中最大的。到目前为止,我制作了Mapper,它将创建以下形式的上下文:,所以关键是NAICS和Area与“_”和Reducer连接:

public static class IntSumReducer extends Reducer<Text,LongWritable,Text,LongWritable> {
private LongWritable result = new LongWritable();
//private HashMap<String, Long> naicsMax = new HashMap<String, Long>();

public void reduce(Text key, Iterable<LongWritable> values, Context context ) throws IOException, InterruptedException {
  long sum = 0;
  for (LongWritable val : values) {
    sum += val.get();
  }
  result.set(sum);
  context.write(key, result);
}
}

到目前为止,该结果将生成结果,例如,因此每个NAICS中的每个Area我都有工资的总和,但是现在我不知道如何继续实现我的目标。我需要在每个NAICS中获得面积工资的最大和,我不知道如何。我在计划映射器中是否犯了任何错误,还是在之类的上下文中是正确的?

非常感谢你的回答

最佳答案

您可以将此reducer的输出提供给另一个map reduce作业。
该作业的映射器可以具有以下逻辑,

  • 在密钥中拆分NAICS和区域,并在
    输出键部分。
  • 以工资的总和附加区域,并用逗号作为分隔符,并给出
    在输出值部分。

  • reducer 可能具有为每个NAICS_Area找到最大工资总额的逻辑。
  • 遍历键(NAICS)并拆分每次迭代的值。
  • 获取总和值并将其强制转换为long,然后实现最大值
    逻辑。


  • public void reduce(Text NAICS, Iterable<Text> values, Context context)       throws IOException, InterruptedException
        {
         long max =0;
        for (Text value : values)
            {
               String[] areaWages = value.toString().Split(',');
               String sumString = areaWages[0];
               long sum = Long.parseLong(sumString);
               String AREA = areaWages[1];
        if(sum > max)
            {
                max = sum;
            }
        }
         context.write(NAICS, new TextAREA))
        }
    

    10-06 12:47