我是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作业。
该作业的映射器可以具有以下逻辑,
输出键部分。
在输出值部分。
reducer 可能具有为每个NAICS_Area找到最大工资总额的逻辑。
逻辑。
,
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))
}