我正在尝试创建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,这不会使您走得太远。