我有一个问题。
我想在大数据集上进行映射,映射过程取决于最大值。
例如
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);
}
但是,在迭代所有记录之前如何计算最大密钥?
答案 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"));
}