web-dev-qa-db-ja.com

tar.gzアーカイブで圧縮された複数のファイルをSpark

Tarに圧縮されたいくつかのjsonファイルからSpark RDDを作成しようとしています。たとえば、3つのファイルがあります。

_file1.json
file2.json
file3.json
_

そして、これらは_archive.tar.gz_に含まれています。

Jsonファイルからデータフレームを作成したい。問題は、Sparkがjsonファイルを正しく読み取っていないことです。sqlContext.read.json("archive.tar.gz")またはsc.textFile("archive.tar.gz")を使用してRDDを作成すると、文字化け/余分な出力が発生します。

Sparkで複数のファイルを含むgzip圧縮されたアーカイブを処理する方法はありますか?

[〜#〜]更新[〜#〜]

Sparkの圧縮からテキストファイル全体を読み取る の回答にある方法を使用して、実行することができましたが、この方法は大きなtarには適していないようです。アプリケーションが大きなアーカイブサイズで詰まると、gzアーカイブ(> 200 mb圧縮)。圧縮後に最大2 GBのリーチサイズを扱っているアーカイブのいくつかとして、問題に対処するための効率的な方法があるかどうか疑問に思っています。

時間がかかるので、アーカイブを抽出してからファイルをマージすることは避けようとしています。

7
septra

解決策は Sparkでの圧縮からテキストファイル全体を読み取る で与えられます。提供されたコードサンプルを使用して、次のように圧縮アーカイブからデータフレームを作成することができました。

val jsonRDD = sc.binaryFiles("gzarchive/*").
               flatMapValues(x => extractFiles(x).toOption).
               mapValues(_.map(decode())

val df = sqlContext.read.json(jsonRDD.map(_._2).flatMap(x => x))

この方法は、比較的小さいサイズのtarアーカイブには問題なく機能しますが、大きいアーカイブサイズには適していません。

この問題のより良い解決策は、tarアーカイブをhadoop SequenceFilesに変換することです。これは分割可能であるため、Spark(tarアーカイブとは対照的に)で並行して読み取りおよび処理できます。)

参照:stuartsierra.com/2008/04/24/a-million-little-files

7
septra