web-dev-qa-db-ja.com

Hadoop Path APIなしでローカルParquetファイルを読み取る

ローカルのParquetファイルを読み込もうとしていますが、見つけることができるAPIはHadoopと密に結合されており、入力としてHadoop Pathが必要です(ローカルファイルを指す場合でも)。

ParquetReader<GenericRecord> reader = AvroParquetReader.<GenericRecord>builder(file).build();
GenericRecord nextRecord = reader.read();

寄木細工のファイルの読み方、スタンドアロンJavaコード? で最も人気のある答えですが、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プラグイン を維持します。これにより、Avroファイルをテーブルに表示するためにペインにドラッグアンドドロップできます。このプラグインは現在5MBです。 ParquetとHadoopの依存関係を含めると、50MBを超えて膨張し、 機能しません になります。


回答後の補遺

これで動作するようになりました(受け入れられた回答のおかげです)、Hadoop Path AP​​Iに大きく依存することによってドラッグされる可能性のあるすべての迷惑なエラーを回避する私の解決策を次に示します。

3
Ben Watson

Hadoopを使用しない必要性が本当に避けられない場合は、Sparkを試して、ローカルバージョンで実行することができます。クイックスタートガイドはここにあります: https:// spark .Apache.org/docs/latest/index.html 。ダウンロードは、次のリンクからダウンロードできます: https://archive.Apache.org/dist/spark/ (検索好きなバージョン、hadoopなしのビルドが常にあります。残念ながら、圧縮されたバージョンのサイズはまだ約10〜15Mです。Java example/examples/src /メイン。

その後、ファイルをSparkこのようにデータフレームとして読み込むことができます

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

このソリューションは、質問の元の条件を満たしています。しかし、それは茂みの周りを叩くようなものだという事実を欠いているわけではありません(しかし、まあ、それは面白いです)。それでも、これに取り組むための新しい可能な方法を開くことが役立つかもしれません。

1
Long Vu

そのために 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);
0
UDIT JOSHI