我有以下文件作为输入,由10000行组成如下
250788965731,20090906,200937,200909,621,SUNDAY,WEEKEND,ON-NET,MORNING,OUTGOING,VOICE,25078,PAY_AS_YOU_GO_PER_SECOND_PSB,SUCCESSFUL-RELEASEDBYSERVICE,5,0,1,6.25,635-10-104-40163.
如果第18列小于10且第9列是早晨,我必须打印第一列。我做了以下代码。我没有得到输出。输出文件为空。
public static class MyMap extends Mapper<LongWritable, Text, Text, DoubleWritable> {
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line = value.toString();
String[] day=line.split(",");
double day1=Double.parseDouble(day[17]);
if(day[8]=="MORNING" && day1<10.0)
{
context.write(new Text(day[0]),new DoubleWritable(day1));
}
}
}
public static class MyReduce extends Reducer<Text, DoubleWritable, Text,DoubleWritable> {
public void reduce(Text key, Iterator<DoubleWritable> values, Context context)
throws IOException, InterruptedException {
String no=values.toString();
double no1=Double.parseDouble(no);
if(no1>10.0)
{
context.write(key,new DoubleWritable(no1) );
}
}
}
请告诉我做错了什么?流程是否正确?
答案 0 :(得分:3)
我可以看到一些问题。
首先,在Mapper
中,在比较.equals()
时,您应该使用==
而不是String
。否则,您只是比较引用,即使String
对象内容相同,比较也将失败。由于Java String实习,它有可能成功,但如果这是原始意图,我会避免过多依赖它。
在你的Reducer
中,我不确定你想要达到什么目标,但无论如何我都会发现一些错误的东西。输入键是Iterable<DoubleWritable>
,因此您应该迭代它并在每个单独的值上应用您需要的任何条件。我将如何重写您的Reducer
:
public static class MyReduce extends Reducer<Text, DoubleWritable, Text,DoubleWritable> {
public void reduce(Text key, Iterator<DoubleWritable> values, Context context)
throws IOException, InterruptedException {
for (DoubleWritable val : values) {
if (val.get() > 10.0) {
context.write(key, val);
}
}
}
}
但整体逻辑没有多大意义。如果您想要做的就是在第18列小于10且第9列为MORNING
时打印第一列,那么您可以使用NullWritable
作为映射器的输出键,并写入列1 day[0]
作为输出值。在这种情况下,您可能甚至不需要Reducer
,您可以使用job.setNumReduceTasks(0);
告诉Hadoop。
有一件事让我想到,如果你的输入只有10k行,你真的需要一个Hadoop工作吗?在我看来,一个简单的shell脚本(例如awk
}就足够了这个小数据集。
希望有所帮助!
答案 1 :(得分:0)
day1 < 10.0
发出值,而您的reducer仅发出值,即。 day1 > 10.0
因此,您的减速机不会输出任何值。所以我认为你的减速机应该是这样的:
String no=values.toString();
double no1=Double.parseDouble(no);
if(no1 < 10.0)
{
context.write(key,new DoubleWritable(no1) );
}
我认为应该得到你想要的输出。