我正在尝试读取一个本地Parquet文件,但是我能找到的唯一api是与hadoop紧密耦合的,并且需要hadoop Path
作为输入(甚至指向本地文件)。
ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
GenericRecord nextRecord = reader.read();
在独立java代码中,最流行的答案是如何读取Parquet文件,但需要hadoop Path
现在已经因为一个神秘的 InputFile
相反。唯一的执行 InputFile
我能找到的是 HadoopInputFile
,所以再次没有帮助。
在avro中,这是一个简单的:
DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
this.dataFileReader = new DataFileReader<>(file, datumReader);
(文件所在位置) java.io.File
). Parquet地板的当量是多少?
我不要求hadoop Path
答案中的依赖性,因为hadoop拖累了bloat和jar地狱,而且要求它读取本地文件似乎很愚蠢。
为了进一步解释后台故事,我维护了一个小的intellij插件,允许用户将avro文件拖放到一个窗格中,以便在表中查看。此插件当前为5mb。如果我包括parquet和hadoop依赖,它会膨胀到50mb以上,甚至不起作用。
回答后附录
现在我已经可以工作了(多亏有了公认的答案),下面是我的工作解决方案,它可以避免由于严重依赖hadoop而导致的所有恼人的错误 Path
应用程序编程接口:
parquetfilereader.java文件
本地化输入文件.java
3条答案
按热度按时间mmvthczy1#
如果不需要使用hadoop是不可避免的,那么您可以尝试spark并在本地版本中运行它。您可以在此处找到快速入门指南:https://spark.apache.org/docs/latest/index.html. 要下载,您可以通过以下链接下载:https://archive.apache.org/dist/spark/ (找一个你喜欢的版本,总有一个没有hadoop的版本。不幸的是,压缩版本的大小仍然在10-15米左右。您还可以在examples/src/main中找到一些java示例。
之后,您可以像这样将文件作为sparkDataframe读入
这个解确实满足问题的原始条件。然而,这并不是没有事实,这就像是打周围的布什(但地狱是的,这是有趣的)。不过,这或许有助于开辟一条解决这一问题的新途径。
liwlm1x92#
不幸的是,javaparquet实现并不独立于一些hadoop库。他们的bugtracker中存在一个问题,即在不依赖hadoop的情况下,用java轻松地读写Parquet文件,但这方面似乎进展不大。这个
InputFile
接口的加入增加了一点解耦,但是实现parquet元数据部分的许多类以及所有压缩编解码器都存在于hadoop依赖关系中。我发现了
InputFile
在smile库中,这可能比通过hadoop文件系统抽象更有效,但不能解决依赖性问题。正如其他答案已经提到的,您可以创建一个hadoop
Path
一个本地文件,并使用它没有问题。通过定义一些排除,hadoop拉入的依赖树可以减少很多。我使用以下方法来减少膨胀(使用gradle语法):
sh7euo9m3#
您可以使用parquetfilereader类来实现这一点
您可以在此处指定本地目录路径