java - 用hadoop获得csv文件最大值(value)的更好方法是什么?

标签 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代码以获取所有表的主要值(value):

映射器:
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])));
    }
}

reducer :
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执行将不会并行运行。

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

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

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

最佳答案

首先,我相信MapReduceBase是已弃用的类,因此您正在学习过时的方法...

关于职位的标题

What is the better way to get the biggest value of a csv file with hadoop?



“更好”的方法是不使用Java MapReduce。其他工具(Pig,Hive,Spark等)通常要好得多,尤其是对于此简单任务。

现在,要从所有值中查找最大值-是的,您需要从映射中获得一个键,该键被强制到单个化简器中,然后扫描所有关联值以获取最大值。您的代码似乎正在这样做。

关于第二个问题-您想在第一列分组。只需使用该列。
output.collect(new Text(SingleData[0]), new
        DoubleWritable(Double.parseDouble(SingleData[2])));

现在,从理论上讲,它应该比"Biggest"键运行得快,因为每个输出键都有许多化简器。

只要知道值是多少,MapReduce通常会将文件输出到HDFS,无论您配置了作业输出到哪里。 Reducer类的output.collect方法对此负责。

关于java - 用hadoop获得csv文件最大值(value)的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41006360/

相关文章:

java - 上下文初始化期间遇到异常 - 库不兼容?

java - Spring AOP : Advice not called in abstract class

r - 如何使用 "cols()"和 "col_double"将逗号作为小数点

java - 有什么方法可以避免使用 Graphics2D 在 JAVA 中重复加载字体吗?

java - 为什么当我在 Servlet 中调用 getName() 时,我会在 html 中看到文件标记的 name 属性?

c - 在C代码中读取同一个文件两次

php - 如何在不重复 header 的情况下合并多个 CSV 文件(使用 PHP)?

csv - 如何从 Hdfs 读取 CSV 文件?

hadoop - 如何实现自定义 map 缩减框架

database - 将 GZIP HDFS 数据复制到 vertica