Amazon Athena でパーティションテーブルを作成して使用するにはどうすればよいですか?

所要時間2分
0

Amazon Athena でパーティションテーブルを作成し、それらを使用してクエリを改善したいと思います。

簡単な説明

Athena テーブルのパーティションを行うことで、それぞれのクエリによってスキャンされるデータの量を制限できるため、パフォーマンスの向上やコストの削減につながります。パーティショニングでは、テーブルをパーツに分割し、列の値に基づいて関連するデータをまとめて保持します。パーティションは仮想列として機能し、クエリごとにスキャンされるデータの量を削減するのに役立ちます。

テーブルを作成し、データをパーティション化するときは、次の点を考慮してください。

  • Amazon Simple Storage Service (Amazon S3) バケットにデータをパーティションとして保存する必要があります。
  • テーブルの作成時に、パーティション列とパーティション化されたデータのルートロケーションを含めます。
  • 適切な方法を選択して、AWS Glue データカタログにパーティションをロードします。クエリを実行したときには、テーブルがデータカタログを参照します。
  • パーティションプロジェクションを使用すると、 Amazon S3 でデータを高度にパーティション化することができます。

解決方法

パーティションを含むテーブルを作成するときに留意すべき点がいくつかあり挙げます。

Amazon S3 での保存

データをパーティション化して、Amazon S3 に保存する必要があります。パーティション化されたデータは、次のいずれかの形式になります。

  • Hive スタイルの形式 (例: s3://doc-example-bucket/example-folder/year=2021/month=01/day=01/myfile.csv)
    注: パスには、パーティションキーの名前と値が含まれています (例: year=2021)
  • Hive 以外のスタイルの形式 (例: s3://doc-example-bucket/example-folder/2021/01/01/myfile.csv)

テーブルの作成時にパーティション情報を含める

CREATE TABLE 文には、パーティションの詳細を含める必要があります。PARTITIONED BY を使用してパーティション列を定義し、LOCATION を使用してパーティション化されたデータのルートロケーションを指定します。次のようなクエリを実行します。

CREATE EXTERNAL TABLE doc-example-table (
first string,
last string,
username string
)
PARTITIONED BY (year string, month string, day string)
STORED AS parquet
LOCATION 's3://doc-example-bucket/example-folder'

このクエリの中を、次のように置換します。

  • doc-example-table を、作成しているテーブルの名前に置換
  • doc-example-bucket を、テーブルを保存する S3 バケットの名前に置換
  • example-folder を、S3 フォルダの名前に置換
  • firstlast、および username を列の名前に置換
  • yearmonth、および day をパーティション列の名前に置換

ユースケースに適したアプローチで、データカタログにパーティションをロードする

テーブルを作成したら、データカタログにパーティションを追加します。次の方法のいずれかを使用してこれを行うことができます。

  • **Hive スタイル形式のデータに対して MSCK REPAIR TABLE クエリを使用します。**MSCK REPAIR TABLE コマンドでは、Amazon S3 などのファイルシステムをスキャンして Hive 互換パーティションを検索します。このコマンドは、テーブル内に既に存在するパーティションと比較を行い、新しいパーティションをデータカタログに追加します。以下のようなコマンドを実行します。
    注: パーティションの数が数千を超える場合は、このアプローチはベストプラクティスではありません。DDL クエリがタイムアウトになる可能性があります。詳細については、「MSCK REPAIR TABLE クエリで AWS Glue データカタログにパーティションが追加されないのはなぜですか?」を参照してください。
MSCK REPAIR TABLE doc-example-table
  • **ALTER TABLE ADD PARTITION クエリは、Hive スタイルおよび非 Hive スタイルの形式のデータの両方に使用します。**ALTER TABLE ADD PARTITION コマンドは、1 つ以上のパーティションをデータカタログに追加します。コマンドで、パーティション列の名前と値のペアと、そのパーティションのデータファイルが格納される Amazon S3 パスを指定します。次のようなコマンドを実行して、クエリごとにパーティションを 1 つ、またはいくつかまとめて追加できます。
ALTER TABLE doc-example-table ADD PARTITION (year='2021', month='01', day='01') LOCATION 's3://doc-example-bucket/example-folder/2021/01/01/'
ALTER TABLE doc-example-table ADD
PARTITION (year='2021', month='01', day='01') LOCATION 's3://doc-example-bucket/example-folder/2021/01/01/'
PARTITION (year='2020', month='06', day='01') LOCATION 's3://doc-example-bucket/example-folder/2020/06/01/'
  • **AWS Glue クローラーを Hive スタイルと非 Hive スタイルの両方の形式のデータに使用します。**Glue クローラーを使用すると、データセットからテーブルのスキーマを自動的に推測し、テーブルを作成し、データカタログにパーティションを追加できます。または、クローラーを使用して、CREATE TABLE 文を使用して手動で作成したテーブルにのみパーティションを追加することもできます。クローラーを使用してパーティションを追加するには、クローラーを定義するときに、データストアを指定するのではなく、クロールのソースとして 1 つ以上の既存のデータカタログテーブルを指定します。クローラーは、データカタログテーブルで指定されたデータストアをクロールします。新しいテーブルは作成されません。代わりに、手動で作成されたテーブルが更新され、新しいパーティションが追加されます。詳細については、「クローラー構成オプションの設定」を参照してください。
  • **Amazon S3 で高度にパーティション化されたデータにパーティションプロジェクションを使用する。**Amazon S3 で高度にパーティション化されたデータがある場合、データカタログへのパーティションの追加は現実的ではなく、時間がかかる場合があります。高度にパーティション化されたテーブルに対するクエリには、時間がかかります。このような場合、パーティションプロジェクション機能を使用して、高度にパーティション化されたテーブルのクエリ処理を高速化し、パーティション管理を自動化できます。パーティションプロジェクションでは、パーティションの値と場所は、データカタログなどのリポジトリから読み取られるのではなく、構成から計算されます。つまり、パーティションプロジェクションを使用すると、データカタログにパーティションを追加する必要はありません。通常、インメモリ操作はリモート操作よりも高速であるため、パーティションプロジェクションは、高度にパーティション化されたテーブルに対するクエリの実行時間を短縮します。パーティションプロジェクション機能は、現在、「enum」、「integer」、「date」、「injected」のパーティション列タイプで動作します。詳細については、「Amazon Athena でのパーティションプロジェクション」を参照してください。

関連情報

Amazon Athena テーブルに対してクエリを実行するときにゼロ個のレコードが返されるのはなぜですか?

AWS公式
AWS公式更新しました 3年前
コメントはありません