如何使用ParquetWriter默认访问权限的多参数构造方法?
解决ParquetWriter包级私有构造方法无法访问的问题
首先得明确:你遇到的问题根源是ParquetWriter的这个构造方法是包级私有(默认访问修饰符),这意味着只有和它处于同一个org.apache.parquet.hadoop包下的类才能直接调用它,跨包的子类哪怕继承了ParquetWriter,也没法访问这个构造方法——这就是你继承后依然报错的原因。
下面给你几个可行的解决方案,按推荐程度排序:
1. 使用官方推荐的Builder模式创建实例
ParquetWriter的设计本身就不建议直接调用构造方法,而是通过对外暴露的静态Builder API来构建实例,所有你需要的参数都可以通过Builder的方法来设置。针对你提到的参数,对应的Builder调用示例如下:
// 假设你的数据类型是YourRecord,WriteSupport实现是YourWriteSupport OutputFile outputFile = ...; // 你的输出文件对象 WriteSupport<YourRecord> writeSupport = new YourWriteSupport(); Configuration conf = ...; ParquetWriter<YourRecord> writer = ParquetWriter.builder(writeSupport, outputFile) .withCompressionCodec(CompressionCodecName.SNAPPY) // 替换成你的压缩编码 .withRowGroupSize(1024 * 1024 * 128) // 替换成你的rowGroupSize .withValidation(true) // 替换成你的validating参数 .withConf(conf) // 传入你的Configuration .withMaxPaddingSize(0) // 替换成你的maxPaddingSize .withEncodingProperties(ParquetProperties.builder().build()) // 替换成你的encodingProps .build();
这种方式是官方推荐的最佳实践,既避免了访问包级成员的问题,也让代码更清晰易读,后续版本升级也不会因为构造方法变更而受影响。
2. 将子类放到同一个包下(不推荐)
如果你一定要直接调用这个构造方法,可以把你的MyParquetWriter类放到org.apache.parquet.hadoop包下。这样因为处于同一个包内,就能访问包级私有构造方法了。
但这种做法非常不推荐:
- 会污染官方的包结构,不符合代码规范
- 后续Parquet版本升级时,构造方法可能发生变化,导致你的代码兼容性问题
- 容易和官方类产生命名冲突或其他潜在问题
3. 考虑升级Parquet版本(可选)
你当前使用的是Parquet 1.10.1,这个版本比较老旧。后续的Parquet版本可能调整了构造方法的访问权限,或者优化了Builder API的功能。不过即使升级,依然推荐使用Builder模式来创建实例,这是官方长期维护的对外API。
总结一下,优先选择Builder模式,这是最稳妥且符合官方设计意图的解决方案。
内容的提问来源于stack exchange,提问作者UDIT JOSHI
相关产品推荐
相关产品推荐

