我正在尝试创建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'
如何在项目中使用此构造函数?
答案 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,这不会使您走得太远...