Статическая инициализация Hadoop Mapper

У меня есть фрагмент кода, в котором я использую статический блок кода для инициализации переменной.

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 в приведенном выше фрагменте кода не инициализируется. Может ли кто-нибудь предложить исправление или альтернативный способ инициализации переменной. Я не хочу инициализировать его внутри моей функции карты, так как это замедляет весь процесс.


person rakeshr    schedule 03.06.2010    source источник


Ответы (5)


Это действительно невозможно, если только сама Java не сломана. Статические инициализаторы всегда срабатывают во время загрузки класса.

Возможно, то, что вы наблюдаете, имеет альтернативное объяснение, например, что-то меняет rt обратно на null. Или вы наблюдаете rt в другом статически инициализированном выражении выше? он будет видеть null до тех пор, пока не завершится инициализация rt.

Но, тем не менее, я бы сказал, что правильнее переопределить метод setup() (configure() в старом API) и сделать инициализацию там. Это произойдет один раз.

person Sean Owen    schedule 03.06.2010

Есть ли какая-то причина, по которой вы не хотите инициализировать rt таким образом?:

public static RTree rt = new RTree("R.rtree");
person Ryan Fernandes    schedule 04.06.2010

Я не эксперт по Java, но похоже, что у вас есть два «статических» назначения для переменной rt: у вас есть:

public static RTree rt = null;

А ТАКЖЕ

rt = new RTree(rtreeFileName);

В каком порядке выполняются эти задания?

Попробуйте это вместо этого и посмотрите, поможет ли это

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

Насколько я знаю Java, это гарантирует, что у вас будет только одно задание.

person Niels Basjes    schedule 05.06.2010
comment
java выполняет статическую часть класса последовательно, когда загружает класс, поэтому будет первое назначение, а затем второе. - person Philip Voronov; 29.06.2016

что, если мы не будем объявлять статический блок и просто напишем.

public static RTree rt =  new RTree(rtreeFileName);

потому что переменная статическая, она будет инициализирована один раз, когда класс загружается в память?

person Mahender Singh    schedule 24.06.2013

вы можете переопределить метод setup() класса картографа, чтобы инициализировать что-либо в отношении функции карты. Этот метод setup() вызывается только один раз, в начале каждого маппера, поэтому он не будет замедлять процесс маппера.

person abisheksampath    schedule 29.06.2016