我正在尝试读取本地Parquet文件,但是我能找到的唯一API与Hadoop紧密结合,并且需要Hadoop Path
作为输入(甚至用于指向本地文件)。
这个问题已经问了好几次了,但是很久以前,而且所有答案都与Hadoop结合在一起。
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
的唯一实现是InputFile
,因此还是没有帮助。
在Avro中,这很简单:
HadoopInputFile
(文件为DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
this.dataFileReader = new DataFileReader<>(file, datumReader);
)。什么是实木复合地板?
我要求答案中没有Hadoop java.io.File
依赖项,因为Hadoop拖拉了膨胀和罐子地狱,要求它读取本地文件似乎很愚蠢。
[为了进一步说明背景知识,我维护了一个小的Path
,允许用户将Avro文件拖放到窗格中以在表中查看。该插件当前为5MB。如果我包括Parquet和Hadoop依赖项,那么它会膨胀到50MB以上,并且IntelliJ plugin。
答案后附录
现在,我可以正常工作了(由于已接受答案),这是我的有效解决方案,它避免了所有可能严重依赖于Hadoopdoesn't even workAPI的令人讨厌的错误:
不幸的是,java parquet实现并非独立于某些hadoop库。他们的LocalInputFile.java的错误追踪器中存在一个问题,但似乎并没有太大的进展。添加了make it easy to read and write parquet files in java without depending on hadoop接口以添加一些解耦,但是许多实现镶木地板元数据部分的类以及所有压缩编解码器都位于hadoop依赖关系中。
我发现InputFile
,这可能比通过hadoop文件系统抽象来的效率更高,但是并不能解决依赖性问题。
正如已经提到的其他答案一样,您可以为本地文件创建hadoop another implementation of InputFile
in the smile library,并将其毫无问题地使用。
InputFile
hadoop引入的依赖树可以通过定义一些排除项来减少很多。我正在使用以下方法来减轻膨胀(使用gradle语法):
Path
您可以为此使用java.io.File file = ...
new org.apache.hadoop.fs.Path(file.toURI())
类
compile("org.apache.hadoop:hadoop-common:3.1.0") {
exclude(group: 'org.slf4j')
exclude(group: 'org.mortbay.jetty')
exclude(group: 'javax.servlet.jsp')
exclude(group: 'com.sun.jersey')
exclude(group: 'log4j')
exclude(group: 'org.apache.curator')
exclude(group: 'org.apache.zookeeper')
exclude(group: 'org.apache.kerby')
exclude(group: 'com.google.protobuf')
}
您可以在此处指定本地目录路径
ParquetFileReader
如果确实不可避免地需要不使用Hadoop,则可以尝试Spark并在本地版本中运行它。可在此处找到快速入门指南:dependencies {
compile group: 'org.apache.hadoop', name: 'hadoop-common', version: '3.2.0'
compile group: 'org.apache.parquet', name: 'parquet-hadoop', version: '1.10.1'
}
。要进行下载,您可以从以下链接下载:private static Path path = new Path("file:\\C:\\myfile.snappy.parquet");
ParquetFileReader r = new ParquetFileReader(conf, path, footer);
(找到您喜欢的版本,总会有一个没有hadoop的版本。不幸的是,压缩版本的大小仍在10-15M左右)。您还可以在examples / src / main中找到一些Java示例。
之后,您可以像这样在Spark Dataframe中读取文件
https://spark.apache.org/docs/latest/index.html
此解决方案确实满足问题的原始条件。但是,这并不能避免像在灌木丛中跳动这样的事实(但是,是的,这很有趣)。尽管如此,它可能有助于打开一种新的可能的方法来解决此问题。