列の1つの値を変更する必要がある、かなり高額な寄木細工のファイルがあります。これを行う1つの方法は、ソーステキストファイルでこれらの値を更新し、寄木細工のファイルを再作成することですが、これに対するより安価で全体的に簡単な解決策があるかどうか疑問に思っています。
基本から始めましょう:
寄木細工は、ファイルシステムに保存する必要があるファイル形式です。
主な質問:
append
操作をサポートしていますか?append
を許可しますか?append
操作を実装できますか?答え:
parquet.hadoop.ParquetFileWriter
はCREATE
およびOVERWRITE
のみをサポートします。 append
モードはありません。 (わかりませんが、これは他の実装で変更される可能性があります-寄木細工のデザインはappend
をサポートしています)
HDFSでは、dfs.support.append
プロパティを使用して、ファイルに対してappend
を許可します
Sparkフレームワークは、既存の寄木細工のファイルへのappend
をサポートしていません。 このJIRAを参照
特に2人のライターが同時にいる可能性があることを考えると、分散システムで既存のファイルに追加することはお勧めできません。
詳細はこちら:
回避策はありますが、更新を容易にするために、特定の方法で寄木細工のファイルを作成する必要があります。
ベストプラクティス:
A.行グループを使用して寄木細工のファイルを作成します。データ圧縮やディクショナリエンコーディングなどの機能が機能しなくなる前に、行グループに入れることができるデータの行数を最適化する必要があります。
B.行グループを1つずつスキャンし、どの行グループを更新する必要があるかを調べます。変更された各行グループの修正されたデータを含む新しい寄木細工ファイルを生成します。ファイル内のすべてのものではなく、一度に1つの行グループに相当するデータを処理する方が、メモリ効率が高くなります。
C.変更されていない行グループを追加し、行グループごとに1つの寄木細工ファイルを読み取ることによって生成された変更された行グループを使用して、元の寄木細工ファイルを再構築します。
行グループを使用して寄木細工ファイルを再構成するのは驚くほど高速です。
理論的には、フッター(統計情報)を削除し、新しい行グループを追加し、更新統計を含む新しいフッターを追加するだけで、既存の寄木細工ファイルに簡単に追加できますが、それをサポートするAPI /ライブラリはありません。
あなたの質問に答え、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
免責事項:私はそれらのブログを書いていない、私はそれを読んだだけで、他の人に役立つかもしれないことに気づいた。
ファイルを再作成する必要があります。これはHadoopの方法です。特にファイルが圧縮されている場合。
別のアプローチ(ビッグデータでは非常に一般的)は、別のParquet(またはORC)ファイルで更新を行い、クエリ時にJOIN/UNIONを実行することです。