我试图从我的数据集中创建2个键,其中有2列数字由制表符分隔。我知道如何制作1键/值,但不知道如何制作第二对键/值。本质上,我想为每个列创建一个键/值。然后在reducer部分中,取每个键的计数差值。
这是我对映射器部分所拥有的:
public static class MyMapper extends Mapper<Object, Text, Text, IntWritable>{
private IntWritable one = new IntWritable(1);
private Text nodeX = new Text();
public void map(Object key, Text value, Context context
) throws IOException, InterruptedException {
String[] data = value.toString().split("\\t");
String node0 = data[0];
String node1 = data[1];
StringTokenizer itr = new StringTokenizer(data);
while(itr.hasMoreTokens()){
nodeX.set(node0);
context.write(nodeX, one)
nodeY.set(node1);
context.write(nodeY, one)
}
}
这里是减速器:
public static class IntSumReducer
extends Reducer<Text,IntWritable,Text,IntWritable> {
private IntWritable result = new IntWritable();
public void reduce(Text key, Iterable<IntWritable> values,
Context context
) throws IOException, InterruptedException {
int sum0 = 0;
for (IntWritable val : values) {
sum0 += val.get()
}
int sum1 = 0;
for (IntWritable val : values) {
sum1 += val.get()
}
diff = sum0 - sum1;
result.set(diff);
context.write(key, diff);
}
}
我认为我在数据从mapper传递到reducer的部分做了一些事情,可能需要2个键。 Java新手,不知道如何正确使用它。
我的输入数据如下所示:
123 543
123 234
543 135
135 123
我希望输出结果是,我可以考虑col1键和col2键出现之和的差异。
123 1
543 0
135 0
234 -1
答案 0 :(得分:0)
我认为您希望将行拆分为单词并将单词设为数字,然后计算差异。您可以使用NLineInputFormat
表示键是行号,拆分值并计算。除此以外 。你可以确定一个静态长类型来记录行号。
public static class TokenizerMapper extends
Mapper<LongWritable, Text, LongWritable, IntWritable>
{
private IntWritable diffen = new IntWritable();
private static long row_num= 0;
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String[] data = value.toString().split("\\t");
String node0 = data[0];
String node1 = data[1];
int dif = Integer.parseInt(node1)-Integer.parseInt(node0);
diffen.set(dif);
row_num++;
context.write(new LongWritable(row_num), diffen);
}
}
您也可以将值写入reduce
并拆分为两部分并计算不同的.ALL即可;