Hadoop计算取决于最大值

时间:2013-11-26 12:35:36

标签: hadoop max

我有一个问题。

我想在大数据集上进行映射,映射过程取决于最大值。

例如

Input:
(key)  (value)    
--------------
key1   1
key2   2
key3   5
key4   6
key5   9

我的计算取决于这些值的最大值,以映射每个点。 我想根据值中的最大数量将这些值分成几组。

例如,上一个输入中的最大数字是9,我想将它们映射到3组。我将使用新密钥:(int) value/(Max/3)

output(of mapping)
(new key)  (new Value)    
----------------------
0          key1
0          key2
1          key3
1          key4
2          key5

我有以下映射器:

protected void map(Object key, InWritable value, Context context)
        throws IOException, InterruptedException {
    int MaximumValue=???;
    int newKey = (int)value/(MaximumValue/3);
    context.write(newKey,Key);
}

但是,在迭代所有记录之前如何计算最大密钥?

1 个答案:

答案 0 :(得分:1)

你可以这样做。

注意:我正在谈论w.r.t Hadoop 1.2.1。您可能需要对较新的API进行一些修改。

在您的驱动程序中,阅读inputpath并解析它并找到最大值。

BufferedReader br = new BufferedReader(new InputStreamReader(
            fs.open(inpath)));
    String line = "";
    line = br.readLine();
    int max = Integer.MIN_VALUE;
    try {
        while (line != null) {
            if (line.trim().length() == 0 || line.trim().equals("")) {
                line = br.readLine();
                continue;
            }
            String[] parts = line.split(" ");
            int val = Integer.parseInt(parts[1]);
            if (val > max)
                max = val;
            line = br.readLine();
        }
    } finally {
        br.close();
    }
}

在配置中进行设置。

conf.setInt("max_val", max);

通过覆盖configure()方法在映射器中读取它。对于较新的API,我认为您必须覆盖setup()方法。

@Override
public void configure(JobConf conf) {
    max = Integer.parseInt(conf.get("max_val"));
}