2010-06-03 145 views
1

我有一个代码片段,我正在使用一个静态代码块来初始化一个变量。hadoop映射器静态初始化

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()); 
       ....... 

     } 

    } 

我的问题是,可变室温在上面的代码片段是没有得到初始化。任何人都可以提出修复或替代方法来初始化变量。我不想在我的map函数中初始化它,因为这会减慢整个过程。

回答

2

这真的不可能,除非Java本身被破坏。静态初始化器总是在类加载时触发。

也许无论你正在观察的是否有其他解释,例如,某事正在设置rt返回到null。或者,你在上面的其他静态初始化表达式中观察rt?它会看到null,直到rt的初始化完成。

但是,我认为重写setup()方法(旧API中的configure())并在那里进行初始化会更整洁。它会发生一次。

0

是有一些原因,你不想初始化室温这样?:

public static RTree rt = new RTree("R.rtree"); 
0

我不是Java专家,但它看起来就像你有一个变量RT两个“静态”的任务: 你有:

public static RTree rt = null;

AND

RT =新RTREE(rtreeFileName);

以何种顺序完成这些分配?

试试这个,看看它是否有助于

public static final RTree rt = new RTree("R.rtree"); 

至于我的Java知识去这个保证你有只分配一次。

+0

java的连续执行类的静态部分时加载类,所以会有第一项任务,然后是第二项任务。 – 2016-06-29 11:37:55

0

如果我们不声明一个静态块并且只是写入,该怎么办。

public static RTree rt = new RTree(rtreeFileName); 

因为变量是静态的,当类加载到内存中时它会被初始化一次?

0

你可以重写mapper类的setup()方法来初始化与map函数有关的任何东西。这种设置()方法被调用一次,在每一个映射的开始,因此,它不会减慢映射过程

1
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 { 
         ......... 
    } 

}