使用hadoop获取csv文件的最大价值的更好方法是什么?

时间:2016-12-06 22:48:10

标签: java csv hadoop mapreduce

我有一个巨大的csv文件,包含4个类似的信息:

DF Alice 20.4
MG Bob 30.4
MG Clara 14.3
SP Daniel 40.2
...

我编写了一个Hadoop map-reduce代码来获取所有表的主要值:

映射器:

public class BolsaFamiliaMapper extends MapReduceBase implements
        Mapper<LongWritable, Text, Text, DoubleWritable> {

    public void map(LongWritable key, Text value, OutputCollector<Text,
        DoubleWritable> output, Reporter reporter) throws IOException { String
        valueString = value.toString();
        String[] SingleData = valueString.split("\t");
        output.collect(new Text("Biggest"), new
            DoubleWritable(Double.parseDouble(SingleData[2])));
    }
}

减速机:

public class BolsaFamiliaReducer extends MapReduceBase implements Reducer<Text,
       DoubleWritable, Text, DoubleWritable> {

    public void reduce(Text t_key, Iterator<DoubleWritable> values,
            OutputCollector<Text,DoubleWritable> output, Reporter reporter)
        throws IOException {
        Text key = t_key;
        double frequency = 0.0;
        while (values.hasNext()) {
            // replace type of value with the actual type of our value
            DoubleWritable value = (DoubleWritable) values.next();
            if (value.get() > frequency) {
                frequency = value.get();
            }
        }
        output.collect(key, new DoubleWritable(frequency));
    }
}

如果我理解的话,reduce执行将不会并行运行,因为我使用的键(“Biggest”)。

有没有更好的方法来获得这些主要价值?

我的另一个疑问是如何获得检查UF(SP)的最大值的元组。是否可以在同一个map-reduce中?如果可能的话,我可以用UF对最大值进行分类吗?

我是map-reduce操作和hadoop的初学者,我在其他论坛找不到任何答案。

1 个答案:

答案 0 :(得分:0)

首先,我相信MapReduceBase是一个弃用的类,所以你正在学习过时的方法......

关于帖子的标题

  

使用hadoop获取csv文件的最大价值的最佳方法是什么?

&#34;更好&#34;方法是不使用Java MapReduce。其他工具(Pig,Hive,Spark等)通常要好得多,特别是对于这个简单的任务。

现在,至于从所有值中找到最大值 - 是的,您需要来自地图的单个键,该键被强制转换为单个缩减器,然后扫描所有关联值以获得最大值。您的代码似乎正在这样做。

关于第二个问题 - 您想要对第一列进行分组。只需使用该列。

output.collect(new Text(SingleData[0]), new
        DoubleWritable(Double.parseDouble(SingleData[2])));

现在,理论上它应该比"Biggest"密钥运行得更快,因为每个输出密钥都有许多减速器。

就看到它的价值而言,MapReduce通常会在您配置作业输出的任何地方将文件吐出到HDFS中。 Reducer类的output.collect方法负责这一点。