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