[英]hadoop mapper static initialisation
我有一个代码片段,其中使用了静态代码块来初始化变量。
public static class JoinMap extends
Mapper<IntWritable, MbrWritable, LongWritable, IntWritable> {
.......
public static RTree rt = null;
static {
String rtreeFileName = "R.rtree";
rt = new RTree(rtreeFileName);
}
public void map(IntWritable key, MbrWritable mbr,Context context)
throws IOException, InterruptedException {
.........
List elements = rt.overlaps(mbr.getRect());
.......
}
}
我的问题是上述代码片段中的变量rt尚未初始化。 任何人都可以提出修正或初始化变量的替代方法。 我不想在地图函数中初始化它,因为这会使整个过程变慢。
除非Java本身已损坏,否则这实际上是不可能的。 静态初始化程序始终在类加载时触发。
也许您正在观察的内容都有其他解释,例如,将rt
设置回null
。 或者,您是否在上面的其他静态初始化表达式中观察rt
? 在rt
的初始化完成之前,它将显示为null
。
但是,尽管如此,我还是想重写setup()
方法(旧API中的configure()
)并在那里进行初始化。 它只会发生一次。
public static class JoinMap extends
Mapper<IntWritable, MbrWritable, LongWritable, IntWritable> {
.......
public RTree rt = null; //note that i removed static modifier
@Override
public void setup(Context context) throws IOException {
//this will be executed once on each mapper before first map(..) call
String rtreeFileName = "R.rtree";
rt = new RTree(rtreeFileName);
}
public void map(IntWritable key, MbrWritable mbr,Context context)
throws IOException, InterruptedException {
.........
}
}
如果我们不声明一个静态块而只写该怎么办?
public static RTree rt = new RTree(rtreeFileName);
因为变量是静态的,当类被加载到内存中时,它将被初始化一次吗?
您是否有某些原因不想这样初始化rt?
public static RTree rt = new RTree("R.rtree");
我不是Java专家,但看起来您为变量rt分配了两个“静态”分配:您有:
公共静态RTree rt = null ;
和
rt =新的RTree(rtreeFileName) ;
这些分配按什么顺序进行?
尝试一下,看看是否有帮助
public static final RTree rt = new RTree("R.rtree");
就我的Java知识而言,这可以确保您只有一次分配。
您可以覆盖mapper类的setup()方法以初始化与map函数有关的任何内容。 在每个映射器的开头,只会调用一次setup()方法,因此,它不会减慢映射器进程的速度
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.