读取本地Parquet文件而不使用hadoop路径api

30byixjq  于 2021-05-27  发布在  Hadoop
关注(0)|答案(3)|浏览(357)

我正在尝试读取一个本地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

mmvthczy

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读入

import org.apache.spark.api.java.*;
import org.apache.spark.api.java.function.*; 

SparkSession spark = SparkSession.builder().appName("Reducing dependecy by adding more dependencies").master("local[*]").getOrCreate();
        DataFrame parquet = sqlContext.read().parquet("C:/files/myfile.csv.parquet");
    parquet.show(20);

这个解确实满足问题的原始条件。然而,这并不是没有事实,这就像是打周围的布什(但地狱是的,这是有趣的)。不过,这或许有助于开辟一条解决这一问题的新途径。

liwlm1x9

liwlm1x92#

不幸的是,javaparquet实现并不独立于一些hadoop库。他们的bugtracker中存在一个问题,即在不依赖hadoop的情况下,用java轻松地读写Parquet文件,但这方面似乎进展不大。这个 InputFile 接口的加入增加了一点解耦,但是实现parquet元数据部分的许多类以及所有压缩编解码器都存在于hadoop依赖关系中。
我发现了 InputFile 在smile库中,这可能比通过hadoop文件系统抽象更有效,但不能解决依赖性问题。
正如其他答案已经提到的,您可以创建一个hadoop Path 一个本地文件,并使用它没有问题。

java.io.File file = ...
new org.apache.hadoop.fs.Path(file.toURI())

通过定义一些排除,hadoop拉入的依赖树可以减少很多。我使用以下方法来减少膨胀(使用gradle语法):

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')
}
sh7euo9m

sh7euo9m3#

您可以使用parquetfilereader类来实现这一点

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);

相关问题