java - Mapreduce Mapper创建2个键用于化简器计算

标签 java maven hadoop mapreduce

我正在尝试从我的数据集中制作2个键,该数据集有2列数字,中间用制表符分隔。我知道如何制作一个键/值,但不确定如何制作第二对键/值。本质上,我想为每个列创建一个键/值。然后在 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)
        }
    }

这是 reducer :
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

最佳答案

我认为您想将行分割成单词,然后让单词成为数字,然后计算差值。您可以使用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就可以了;

关于java - Mapreduce Mapper创建2个键用于化简器计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47087397/

相关文章:

java - hadoop在reducer中获取最大值

java - Hadoop Java - 将文件从Windows共享文件夹服务器复制到HDFS

java - 从库中访问 Context 上下文

java - 递归Java方法中的返回语句不终止方法

Hadoop 和 HBase 集成

java - 如何使用 Jenkins 中的插件覆盖属性文件?

java - Maven sonarqube 插件是否读取故障安全报告?

java - 如何从另一个字符串替换一个字符串?

java - 获取 JFrame 中 JTextField 的坐标

java - 如何将 maven 与 slack 集成?