ParquetWriter构造函数不可见

时间:2019-05-19 06:01:26

标签: java constructor parquet

我正在尝试创建ParquetWriter类的对象,该对象接受参数(OutputFile,Mode,WriteSupport,CompressionCodecName,int,boolean,Configuration,int,ParquetProperties)。  但是此构造函数在我使用的API中具有默认的访问修饰符。我无法访问它。

我已经包含了来自Maven的实木复合地板库

$apply

我什至试图扩展该类,但仍然得到错误构造函数不可见

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

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

1 个答案:

答案 0 :(得分:0)

我查看了类ParquetWriter的实现,无论如何,所有构造函数都被标记为“已弃用”。
您应该做的是使用Builder中作为嵌套类提供的inted 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,这不会使您走得太远...