パーティション
テーブルをパーティション化すると 2 つの効果があります。Athena が読み取る量が減り、 データベースにはもう存在しない履歴をデータレイクに保持できるようになります。
ここで何も設定しなければ、すべてのテーブルはそのままコピーされます。テーブルが 大きくなるまではこれで十分に機能します。
パーティション化する理由
Section titled “パーティション化する理由”年と月でパーティション化されたテーブルは、S3 上でディレクトリになります。
catalog/{cluster}/vendas.pagamentos/ano=2024/mes=03/*.parquetクエリに WHERE ano = 2024 AND mes = 3 があると、Athena は そのディレクトリだけ を
読み取ります。パーティションがなければテーブル全体を読み取り、その分の課金が発生します。
Partições(パーティション)で、クラスター、データベース、テーブルを選んで設定を 作成します。次にパーティションカラムを定義します。値を計算する式と、結果として 生成されるカラム名です。
year(CAST(payment_date AS TIMESTAMP)) → anomonth(CAST(payment_date AS TIMESTAMP)) → mes順序が重要です。粗い単位から細かい単位へ。月より前に年、日より前に月です。
何階層まで使うか
Section titled “何階層まで使うか”値の組み合わせごとにディレクトリが 1 つ作られ、ディレクトリが多すぎると書き込みが 遅くなり、ジョブのメモリを使い果たすおそれがあります。
Data Pump は利用可能なメモリとテーブルの幅から、収まるディレクトリ数を自動で 計算します。40 カラムのテーブルは、3 カラムのテーブルよりはるかに少ないディレクトリしか 扱えません。上限を超える場合は、失敗する代わりにバッチに分けて書き込みます。
とはいえ、意図をもって選ぶ価値はあります。数年分の履歴があるテーブルを日単位で パーティション化すると数千のディレクトリが生成されますが、クエリがその粒度を必要と することはまれです。年と月で十分な場合がほとんどです。
ソート用のフィールドはありますが、コストが高くつきます。最初の 1 行を書き込む前に、 テーブル全体をソートする必要があるためです。Parquet はブロックごとの最小値と最大値を すでに保持しているため、ソートがなくても Athena は十分に絞り込めます。理由が明確な 場合にのみ使用してください。
直接コピーを置き換える
Section titled “直接コピーを置き換える”デフォルトでは、パーティション化されたテーブルはデータレイクに 2 回 現れます。 テーブル全体のコピーと、パーティション化されたバージョンが並びます。これは意図的な 動作で、移行中に両者を比較できるようにするためです。
パーティション化されたものだけが必要になったら、直接コピーを置き換える を有効に します。
長期履歴を保持する を有効にすると、そのテーブルは実行ごとに消去されない領域に 書き込まれるようになります。
これにより Postgres から古いデータを失わずにパージできます。 データベースから
外れた月も、データレイクでは引き続き検索できます。catalog/ は現在のデータベースを
反映し、longterm/ は蓄積します。
実行ごとに再書き込みされるのは、そのエクスポートに含まれるパーティションだけです。 データベースからもう届かないものはそのまま残ります。
変更された行を更新する
Section titled “変更された行を更新する”履歴の保持だけでも、行が作られた後は変わらないトランザクションテーブルには十分です。 しかし、取り込み済みの行がデータベース側で修正された場合、古いバージョンが データレイクに残ります。しかもその行は、もうエクスポートに含まれないパーティションに あるかもしれません。
変更された行を更新する を有効にし、次を指定します。
- キーカラム — どの行を置き換えるかを判別するために行を識別します
- 変更を判別する条件 — 前回の取り込み以降に変更された行をエクスポートから選択する
条件です(例:
updated_at > current_date - 7)
Data Pump は該当する行を含むファイルを特定し、古いバージョンを新しいものに差し替えます。
各置き換えの前に、直前の状態が longterm/overrides/{export}/ に保存されます。
これは何が置き換えられたかを示す唯一の記録です。置き換えが誤っていた場合は、
そこから復元します。同じエクスポートを再処理しても、この記録は上書きされません。
同じ取り込みを繰り返す
Section titled “同じ取り込みを繰り返す”同じエクスポートを 2 回実行しても安全です。書き込みは再書き込み前にパーティションを 削除し、置き換えはキーカラムで突き合わせます。結果は 1 回だけ実行した場合と同じです。