我正在尝试创建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);

    }
}


如何在项目中使用此构造函数?

最佳答案

我看了ParquetWriter类的实现,无论如何,所有构造函数都标记为“不推荐使用”。
您应该做的是使用inted 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...
}


正如this question中所指出的那样,扩展具体类(尤其是在不受您控制的情况下)通常不被视为最佳实践。最好从接口继承,但是ParquetWriter仅使用Closeable,这不会使您走得太远。

07-27 13:32