我有一个巨大的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/