【问题标题】:What is the better way to get the biggest value of a csv file with hadoop?使用 hadoop 获得 csv 文件的最大价值的更好方法是什么?
【发布时间】:2016-12-06 22:48:09
【问题描述】:

我有一个巨大的 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的初学者,在其他论坛上找不到任何答案。

【问题讨论】:

  • 一定要用Java MapReduce吗?为什么不是猪?
  • 是的,我有。我正在研究 map-reduce,后者我也会在 Pig 上进行测试。但现在我需要使用 Java MapReduce。
  • 我想你在这里问了两个问题......要找到整体的最大价值,我相信你需要一个减速器,是的,因为这将迫使 Iterator&lt;DoubleWritable&gt; values 拥有你所有的价值想比较。至于“分组”这个“UF”值。您将"Biggest" 替换为SingleData[0]
  • 谢谢,效果也不错。您对values 的使用非常清楚。实际上我问了两个以上的问题,现在我只需要知道如何检索biggest 值的元组。再次感谢。

标签: java csv hadoop mapreduce


【解决方案1】:

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

关于文章标题

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

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

现在,至于从所有值中查找最大值 - 是的,您需要地图中的一个键,该键被强制放入单个 reducer,然后扫描所有关联值以查找最大值。您的代码似乎正在这样做。

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

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

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


就值而言,MapReduce 通常会在您配置作业输出的任何位置将文件输出到 HDFS。 Reducer 类的output.collect 方法对此负责。

【讨论】:

  • 按 UF 分组并仅获得最大值是有意义的,因为我在数据库中有很多 UF,所以出现问题。最后,我使用了两个 MapReuce 类来解决这个问题。关于元组,我认为这个问题并不清楚:我试图获得最大的价值并保存 csv 文件的所有行(SP Daniel 40.2),但我不知道该怎么做。
  • 关于不推荐使用的类,我不知道,但出于目的(学习 MapReduce 范例)它很好。
  • 就个人而言,我从 Hadoop Definitive Guide 中学到了,即使这也需要一个新版本......但是,在线文档是最新的。 hadoop.apache.org/docs/stable/hadoop-mapreduce-client/…
  • 我读了一部分,似乎是一个很好的指南。再次感谢。最后,有没有办法获得最大价值的所有管子? (SP Daniel 40.2)
  • 您的输出文件应该包含所有这些。您将无法直接从代码中获取所有元组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多