gpt4 book ai didi

java - ParquetWriter 构造函数不可见

转载 作者:行者123 更新时间:2023-12-02 05:30:25 25 4
gpt4 key购买 nike

我正在尝试创建接受参数(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com