web-dev-qa-db-ja.com

Apache parquetファイルの値を更新する

列の1つの値を変更する必要がある、かなり高額な寄木細工のファイルがあります。これを行う1つの方法は、ソーステキストファイルでこれらの値を更新し、寄木細工のファイルを再作成することですが、これに対するより安価で全体的に簡単な解決策があるかどうか疑問に思っています。

14
marcin_koss

基本から始めましょう:

寄木細工は、ファイルシステムに保存する必要があるファイル形式です。

主な質問:

  1. 寄木細工はappend操作をサポートしていますか?
  2. ファイルシステム(つまり、HDFS)はファイルにappendを許可しますか?
  3. ジョブフレームワーク(Spark)はappend操作を実装できますか?

答え:

  1. parquet.hadoop.ParquetFileWriterCREATEおよびOVERWRITEのみをサポートします。 appendモードはありません。 (わかりませんが、これは他の実装で変更される可能性があります-寄木細工のデザインはappendをサポートしています)

  2. HDFSでは、dfs.support.appendプロパティを使用して、ファイルに対してappendを許可します

  3. Sparkフレームワークは、既存の寄木細工のファイルへのappendをサポートしていません。 このJIRAを参照

特に2人のライターが同時にいる可能性があることを考えると、分散システムで既存のファイルに追加することはお勧めできません。

詳細はこちら:

8
KrazyGautam

回避策はありますが、更新を容易にするために、特定の方法で寄木細工のファイルを作成する必要があります。

ベストプラクティス:

A.行グループを使用して寄木細工のファイルを作成します。データ圧縮やディクショナリエンコーディングなどの機能が機能しなくなる前に、行グループに入れることができるデータの行数を最適化する必要があります。

B.行グループを1つずつスキャンし、どの行グループを更新する必要があるかを調べます。変更された各行グループの修正されたデータを含む新しい寄木細工ファイルを生成します。ファイル内のすべてのものではなく、一度に1つの行グループに相当するデータを処理する方が、メモリ効率が高くなります。

C.変更されていない行グループを追加し、行グループごとに1つの寄木細工ファイルを読み取ることによって生成された変更された行グループを使用して、元の寄木細工ファイルを再構築します。

行グループを使用して寄木細工ファイルを再構成するのは驚くほど高速です。

理論的には、フッター(統計情報)を削除し、新しい行グループを追加し、更新統計を含む新しいフッターを追加するだけで、既存の寄木細工ファイルに簡単に追加できますが、それをサポートするAPI /ライブラリはありません。

2
David Lee

あなたの質問に答え、Spark(Scala)を使用して更新を実行する方法を提供できるこの素敵なブログを見てください:

http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html

ブログからコピーして貼り付け:

データ構造(Parquet)でデータを編集する必要がある場合、それは不変です。

Parquetファイルにパーティションを追加できますが、その場でデータを編集することはできません。

ただし、最終的にはデータを変更することができます。適切な処理を行わないことを受け入れる必要があります。スキーマとUDFの組み合わせを使用してParquetファイルを再作成し、不良データを修正する必要があります。

Parquetにデータを段階的に追加したい場合(この質問をしなかった場合でも、他の読者には役立ちます)これをよく参照してください書かれたブログ:

http://aseigneurin.github.io/2017/03/14/incrementally-loaded-parquet-files.html

免責事項:私はそれらのブログを書いていない、私はそれを読んだだけで、他の人に役立つかもしれないことに気づいた。

1
Anandkumar

ファイルを再作成する必要があります。これはHadoopの方法です。特にファイルが圧縮されている場合。

別のアプローチ(ビッグデータでは非常に一般的)は、別のParquet(またはORC)ファイルで更新を行い、クエリ時にJOIN/UNIONを実行することです。

0
Thomas Decaux