我是 hadoop 的新手。我正在尝试在以下代码中向 reducer 发送 2 个浮点参数。mapper 成功地将参数传递给 reducer 但是如果我开始运行 reducer 空指针异常抛出.. 任何人都可以帮助我。提前致谢。
public class MaxTemperature extends Configured implements Tool {
public static class MapMapper extends Mapper<LongWritable, Text, Text, PairWritable>{
public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{
String regex = ",";//''single quote not applicable for comma.
String[] val = value.toString().split(regex);
FloatWritable[] vv = new FloatWritable[2];
vv[0]= new FloatWritable(Float.parseFloat(val[3]));
vv[1]=new FloatWritable(Float.parseFloat(val[13]));
float dd=Float.parseFloat(val[3]);
PairWritable ddd = new PairWritable();
context.write(new Text(val[2]), ddd.set(vv[0], vv[1]));
}
}
public static class PairWritable extends ArrayWritable implements Writable{
public PairWritable() {
super(FloatWritable.class);
// TODO Auto-generated constructor stub
}
private FloatWritable floatone;
private FloatWritable floattwo;
public String toString() {
String s = Float.toString(floatone.get());
String a=Float.toString(floattwo.get());
String q = s+'\t'+a;
return q;
}
public void set(float f1, float f2){
FloatWritable ff1 = new FloatWritable(f1);
FloatWritable ff2 = new FloatWritable(f1);
set(ff1, ff2);
}
public PairWritable set(FloatWritable f1, FloatWritable f2){
this.floatone=f1;
this.floattwo=f2;
return this;
}
public float getone(){
return floatone.get();
}
public float gettwo(){
return floattwo.get();
}
public void write(DataOutput out) throws IOException {
// TODO Auto-generated method stub
this.floatone.write(out);
this.floattwo.write(out);
}
public void readFields(DataInput in) throws IOException {
// TODO Auto-generated method stub
this.floatone.readFields(in);
this.floattwo.readFields(in);
}
}
public static class Mapreducers extends Reducer<Text,PairWritable, Text,PairWritable>{
public void reduce(Text key, Iterable<PairWritable> values,Context context) throws IOException, InterruptedException{
float sumone =0;
float sumtwo=0;
for(PairWritable dd: values){
sumone+=dd.getone();
sumtwo+=dd.gettwo();
}
FloatWritable result1 = new FloatWritable(sumone);
FloatWritable result2 = new FloatWritable(sumtwo);
PairWritable ddd = new PairWritable();
context.write(key, ddd.set(result1, result2));
}
}
public int run(String[] args) throws Exception {
Job job = new Job();
job.setJarByClass(MaxTemperature.class);
job.setJobName("MaxTemperature");
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(args[0]), conf);
if(fs.exists(new Path(args[1]))){
fs.delete(new Path(args[1]),true);
}
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(MapMapper.class);
//job.setCombinerClass(Mapreducers.class);
//job.setNumReduceTasks(0);
job.setReducerClass(Mapreducers.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(PairWritable.class);
return job.waitForCompletion(true)?0:1;
}
public static void main(String[] args) throws Exception{
int xx =1;
xx = ToolRunner.run(new MaxTemperature(), args);
System.exit(xx);
}
}
最佳答案
我怀疑问题只是在反序列化时,没有任何内容填充floatone 和floattwo 字段。您正试图在不存在的对象中填充数据。这:
public void readFields(DataInput in) throws IOException {
this.floatone.readFields(in);
this.floattwo.readFields(in);
}
应该是:
public void readFields(DataInput in) throws IOException {
floatone = new FloatWritable();
floattwo = new FloatWritable();
floatone.readFields(in);
floattwo.readFields(in);
}
或者,更改 write 和 readFields:
public void write(DataOutput out) throws IOException {
out.writeFloat(floatone.get());
out.writeFloat(floattwo.get());
}
public void readFields(DataInput in) throws IOException {
floatone = new FloatWritable(in.readFloat());
floattwo = new FloatWritable(in.readFloat());
}
对我来说,这看起来更清晰并且可能更有效率。
关于java - 将多个 float 参数发送到 reducer 结果空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24080077/
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案