Лучший способ получить параметр в методе DoFn onElement в Apache Beam

#apache-beam

#apache-beam

Вопрос:

Мне нужно передать параметр из Main в мой метод DoFn, который будет использоваться методом onElement. Ниже приведен пример в коде.

 public class MyPTransformClass<T> extends PTransform<PCollection<elemCLass>, PDone> {

@Override
public PDone expand(PCollection<elemClass> input) {
    input.apply(ParDo.of(new Fn<>()));
    return PDone.in(input.getPipeline());
}

private static class Fn<T> extends DoFn<elemClass, String> {

    private Fn() {
    }

    @Setup
    public void onSetup() {
      
    }

    @ProcessElement
    public void onElement(final ProcessContext context) {
        //Do some transformation using a PARAMETER passed from outside
    }
}
  

}

Мне было интересно, как я могу передать указанный выше ПАРАМЕТР в свой DoFn без использования side_input. Это не является динамическим и будет оставаться неизменным на протяжении всего выполнения.

Я попытался передать его в MyPTransform, а затем получить к нему доступ из DoFn, но в DoFn он всегда оказывается нулевым.

Любое предложение приветствуется.

Спасибо

Ответ №1:

Используйте свойство, которое передается DoFn в конструкторе.

Если это параметр, который доступен в параметрах конвейера, то вы можете прочитать это значение в расширении PTransform .

 private static class Fn extends DoFn<elemClass, String> {

int something;

    public Fn(int something) {
    this.something = something
    }

    @Setup
    public void onSetup() {
      
    }

    @ProcessElement
    public void onElement(final ProcessContext context) {
        //Do some transformation using a PARAMETER passed from outside
        use something
    }
}