Конструктор ParquetWriter не виден - PullRequest
0 голосов
/ 19 мая 2019

Я пытаюсь создать объект класса ParquetWriter, который принимает аргумент (OutputFile, Mode, WriteSupport, CompressionCodecName, int, boolean, Configuration, int, ParquetProperties).Но этот конструктор имеет модификатор доступа по умолчанию в API, который я использую.Я не могу получить к нему доступ.

Я включил библиотеку паркета из maven

compile group: 'org.apache.parquet', name: 'parquet-hadoop', version: '1.10.1'

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

public class MyParquetWriter  extends ParquetWriter{

    MyParquetWriter(OutputFile file, Mode mode, WriteSupport writeSupport, CompressionCodecName compressionCodecName,
            int rowGroupSize, boolean validating, Configuration conf, int maxPaddingSize,
            ParquetProperties encodingProps) throws IOException {
        super(file, mode, writeSupport, compressionCodecName, rowGroupSize, validating, conf, maxPaddingSize, encodingProps);

    }
}

Как я могу использовать этот конструктор в моем проекте?

1 Ответ

0 голосов
/ 19 мая 2019

Я посмотрел на реализацию класса ParquetWriter, и все конструкторы все равно помечены как устаревшие.
То, что вы должны сделать, это создать его экземпляр с целочисленным классом Builder, который предоставляется как вложенный класс в ParquetWriter.

Таким образом, вы также можете быть уверены, что ваш код будет совместим с будущими версиями.

Для получения дополнительной информации о том, как использовать строители, см. Эту статью:
https://dzone.com/articles/design-patterns-the-builder-pattern

Изменить: Что я делал в подобных ситуациях, так это написал класс Wrapper, который (в данном случае) будет использовать Builder для инициализации частного экземпляра ParquetWriter:

public class MyParquetWriterWrapper implements Closeable {
    private final ParquetWriter parquetWriter;

    public MyParquetWriterWrapper(Path file, WriteSupport writeSupport, CompressionCodecName compressionCodecName, int blockSize, int pageSize) throws IOException {
        ParquetWriter.Builder parquetWriterbuilder = new ParquetWriter.Builder() {
            @Override
            protected ParquetWriter.Builder self() {
                return this;
            }

            @Override
            protected WriteSupport getWriteSupport(org.apache.hadoop.conf.Configuration conf) {
                return writeSupport;
            }
        };

        parquetWriterbuilder.withCompressionCodec(compressionCodecName);
        parquetWriterbuilder.withPageSize(pageSize);
        // ... + other properties which you want to be set

        parquetWriter = parquetWriterbuilder.build(); // building the parquetWriter instance
    }

    public ParquetWriter unwrap() {
        return this.parquetWriter;
    }

    @Override
    public void close() throws IOException {
        parquetWriter.close();
    }

Вместо переопределения методов из ParquetWriter, Оболочка будет просто переадресовывать вызовы:

public void write(T object) throws IOException {
    // some code before writing...
    this.parquetWriter.write(object);
    // some code after writing...
}

Как также указано в в этом вопросе , расширение конкретного класса (особенно когда оно не находится под вашим контролем) обычно не считается наилучшей практикой. Было бы лучше унаследовать от интерфейса, но ParquetWriter использует только Closeable, который не продвинет вас слишком далеко ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...