【发布时间】:2020-05-13 07:28:04
【问题描述】:
我正在尝试读取本地 Parquet 文件,但是我能找到的唯一 API 与 Hadoop 紧密耦合,并且需要 Hadoop Path 作为输入(即使指向本地文件)。
ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
GenericRecord nextRecord = reader.read();
是how to read a parquet file, in a standalone java code? 中最受欢迎的答案,但需要 Hadoop Path,现在已弃用,取而代之的是神秘的 InputFile。我能找到的InputFile 的唯一实现是HadoopInputFile,所以再次没有帮助。
在 Avro 中,这很简单:
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
this.dataFileReader = new DataFileReader<>(file, datumReader);
(其中文件为java.io.File)。 Parquet 等价物是什么?
我要求答案中没有 Hadoop Path 依赖项,因为 Hadoop 会拖入臃肿和 jar 地狱,并且要求它来读取本地文件似乎很愚蠢。
为了进一步解释背景故事,我维护了一个小的 IntelliJ plugin,它允许用户将 Avro 文件拖放到窗格中以在表格中查看。这个插件目前是 5MB。如果我包含 Parquet 和 Hadoop 依赖项,它会膨胀到超过 50MB,并且doesn't even work。
回答后附录
现在我已经让它工作了(感谢接受的答案),这是我的工作解决方案,它避免了严重依赖 Hadoop Path API 可能导致的所有烦人的错误:
【问题讨论】:
-
很好的问题,非常感谢您提供的答案后附录代码。像魅力一样工作!