java - 在 Java Hadoop 2.2 的 MapReduce 中对一系列值进行分组

标签 java json hadoop mapreduce

我有以下 JSON 格式的输入数据。

        "SeasonTicket": false, 
        "name": "Vinson Foreman", 
        "gender": "male", 
        "age": 50, 
        "email": "vinsonforeman@cyclonica.com", 
        "annualSalary": "$98501.00", 
        "id": 0

我需要根据工资范围对值进行排序,即1000-10000、10000-25000等。

Range        Count 
1000-10000     10
10000-50000    20

我没有使用默认的 JSON 解析器或 Jackson 来处理数据,而是将其解析为字符串。我有以下映射和化简函数。

map 功能

public class DemoMapper extends MapReduceBase
        implements Mapper<LongWritable, Text, Text, IntWritable> {

    private final IntWritable v = new IntWritable(1);
    private Text k = new Text();

    @Override
    public void map(LongWritable key, Text value,
                    OutputCollector<Text, IntWritable> output, Reporter reporter)
            throws IOException {
        try {
            if (line.contains("annualSalary")) {
                String s = line.replaceAll("$", "");
                String t = s.substring(26);
                Double x = Double.parseDouble(t);

                StringTokenizer itr = new StringTokenizer(t);
                while (itr.hasMoreTokens()) {
                    Double x = Double.parseDouble(s.substring(26));
                    if (x > 1000 && x < 10000) {
                        k.set(itr.nextToken());
                        output.collect(k, v);
                    } else if (x > 10000 && x < 50000) {
                        k.set(itr.nextToken());
                        output.collect(k, v);
                    } else if (x > 50000 && x < 100000) {
                        k.set(itr.nextToken());
                        output.collect(k, v);
                    } else if (x > 100000) {
                        k.set(itr.nextToken());
                        output.collect(k, v);
                    }
                    output.collect(k, v);
                }

            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }
}

归约函数

public class DemoReducer extends MapReduceBase
        implements Reducer<Text, IntWritable, Text, IntWritable> {
    private IntWritable count = new IntWritable();

    @Override
    public void reduce(Text key, Iterator<IntWritable> values,
                       OutputCollector<Text, IntWritable> output, Reporter reporter)
            throws IOException {
        int sum = 0;
        while (values.hasNext()) {
            IntWritable value = (IntWritable) values.next();
            sum += value.get();
        }
        count.set(sum);
        output.collect(key, (IntWritable) count);
    }
}

如果可能,请让我知道在不使用 JSON 解析器的情况下对这些数据进行分组。

最佳答案

要按范围对数据进行分组,您可以使用自定义分区器 - example .

关于java - 在 Java Hadoop 2.2 的 MapReduce 中对一系列值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23188745/

相关文章:

java - 为什么在尝试对 ResultSet 中检索到的列的值求和时出现错误?

java - 使用 livedata 的 Recyclerview 在数据更改后不会更新。仅在我旋转屏幕后

java - 如何使用 jmeter BeanShell 将反斜杠 (\) 替换为正斜杠 (/)

javascript - 如何在 React post 方法调用中传递带有表示数字数据类型的值的 json 属性

hadoop - 更新 CDH (5.0.0 -> 5.0.2) 后无法启动 impala

java内部类方法访问

node.js - SQLite3 Node.js JSON

jquery - 使用jquery读取json文件

Hadoop HDFS 和序列文件

hadoop - Apache Flink - 跟踪最大值