java - ParquetWriter 构造函数不可见

标签 java constructor parquet

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

我已经包含了来自 maven 的 parquet 库

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 的实现,所有构造函数都被标记为“已弃用”。
您应该做的是使用 Builder 类实例化它,该类作为 ParquetWriter 中的嵌套类提供。

这样您还可以确保您的代码与 future 版本兼容。

有关如何使用构建器的更多信息,请参阅本文:
https://dzone.com/articles/design-patterns-the-builder-pattern

编辑: 在类似情况下,我一直在做的是编写一个 Wrapper 类,该类(在本例中)将使用 Builder 来初始化私有(private) 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();
    }

Wrapper 不会覆盖 ParquetWriter 中的方法,而是简单地转发调用:

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

正如 this question 中也指出的那样,扩展具体类(特别是当不受您控制时)通常不被认为是最佳实践。从接口(interface)继承会更好,但 ParquetWriter 仅使用 Closeable,这不会让您走得太远......

关于java - ParquetWriter 构造函数不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56205179/

相关文章:

java - 由于字符串中存在斜杠,字符串到 JSONArray 出现异常

java - 如何在 Java 中检查启动时是否按下了键

c++ - 为什么类型变量;不调用默认的构造函数?

python - 为什么 Dask 似乎存储 Parquet 效率低下

java - 通过 http 下载文件到同一主机时 Websocket 会阻塞

当作为 Docker 容器运行时,Java Spring 不会与 Consul 对话

delphi - Delphi中如何指定调用哪个基类的重写方法?

python - __init__() 内部和外部变量之间的差异(类和实例属性)

java - 在 Spark 中对 RDD 执行分组并将每个组写入单独的 Parquet 文件

dask - 为什么在 dask 中计算索引 Parquet 文件的形状如此缓慢?