Linux Foundation Delta Lake テーブルへのクエリ - Amazon Athena

Linux Foundation Delta Lake テーブルへのクエリ

Linux Foundation Delta Lake は、ビッグデータ分析用のテーブル形式です。Amazon Athena を使用すると、マニフェストファイルを生成したり、MSCK REPAIR ステートメントを実行したりすることなく、Amazon S3 に保存されている Delta Lake テーブルを直接読み込むことができます。

Delta Lake 形式には、各データファイルの列ごとの最小値と最大値が格納されます。Athena の実装では、この情報を利用して述語でのファイルスキップが可能になり、不要なファイルが考慮対象から除外されます。

考慮事項と制約事項

Athena の Delta Lake には、次の制限があります。

  • [AWS Glue カタログ付きのテーブルのみ] - Delta Lake のネイティブサポートは、AWS Glue に登録されたテーブルでのみサポートされます。別のメタストアに登録されている Delta Lake テーブルがある場合でも、それを保持してプライマリのメタストアとして扱うことができます。Delta Lake のメタデータはメタストアではなくファイルシステム (Amazon S3 など) に保存されるため、Athena では Delta Lake テーブルから読み込むには AWS Glue にある場所プロパティのみが必要です。

  • [V3 engine only] (V3 エンジンのみ) - Delta Lake クエリは Athena エンジンバージョン 3 でのみサポートされます。作成するワークグループが Athena エンジンバージョン 3 を使用するように設定する必要があります。

  • [No time travel support] (タイムトラベルのサポートなし) - Delta Lake のタイムトラベル機能を使用するクエリはサポートされていません。

  • [Read only] (読み込み専用) - UPDATEINSERT または DELETE のような DML ステートメントの記述はサポートされていません。

  • Lake Formation サポート — Lake Formation の統合は、AWS Glueと同期したスキーマの Delta Lake テーブルに利用できます。詳細については、「AWS Lake Formation デベロッパーガイド」の「Amazon Athena での AWS Lake Formation の使用」および「Delta Lake テーブルのアクセス許可をセットアップする」を参照してください。

  • [Limited DDL support] (限定的な DDL サポート) - 次の DDL ステートメントは以下の CREATE EXTERNAL TABLESHOW COLUMNSSHOW TBLPROPERTIESSHOW PARTITIONSSHOW CREATE TABLE、および DESCRIBE をサポートしています。CREATE EXTERNAL TABLE ステートメントの使用方法については、「開始」のセクションを参照してください。

  • S3 Glacier オブジェクトのスキップはサポートされていません — Linux Foundation Delta Lake テーブルのオブジェクトが Amazon S3 Glacier ストレージクラスにある場合、read_restored_glacier_objects テーブルプロパティを false に設定しても効果はありません。

    例えば、次のコマンドを実行したとします。

    ALTER TABLE table_name SET TBLPROPERTIES ('read_restored_glacier_objects' = 'false')

    Iceberg および Delta Lake テーブルでは、コマンドは「サポートされていないテーブルプロパティキー: read_restored_glacier_objects」というエラーを生成します。Hudi テーブルでは、ALTER TABLE コマンドはエラーを発生しませんが、Amazon S3 Glacier オブジェクトはまだスキップされません。ALTER TABLE コマンドの後に SELECT クエリを実行すると、引き続きすべてのオブジェクトが返されます。

サポートされる非パーティション列のデータ型

非パーティション列では、Athena がサポートしている CHAR 以外のデータ型をすべてのデータ型がサポートされます (CHAR は Delta Lake プロトコル自体ではサポートされていません)。サポートされているデータ型は次のとおりです。

boolean tinyint smallint integer bigint double float decimal varchar string binary date timestamp array map struct

サポートされているパーティション列のデータ型

Athena は、パーティション列で次のデータ型を持つテーブルをサポートしています。

boolean integer smallint tinyint bigint decimal float double date timestamp varchar

Athena でのデータ型についての詳細は、「Amazon Athena のデータ型」を参照してください。

開始

クエリを実行するには、Delta Lake テーブルが AWS Glue に存在している必要があります。テーブルが Amazon S3 にあるものの AWS Glue にはない場合には、次の構文を使用して CREATE EXTERNAL TABLE ステートメントを実行します。テーブルがすでに AWS Glue に存在する場合 (たとえば、Apache Spark や AWS Glue で他のエンジンを使用している場合)、この手順は省略できます。

CREATE EXTERNAL TABLE [db_name.]table_name LOCATION 's3://DOC-EXAMPLE-BUCKET/your-folder/' TBLPROPERTIES ('table_type' = 'DELTA')

列定義、SerDe ライブラリ、およびその他のテーブルプロパティが省略されていることに注意してください。従来の Hive テーブルとは異なり、Delta Lake テーブルのメタデータは Delta Lake のトランザクションログから推測され、AWS Glue に直接同期されます。

注記

Delta Lake テーブルでは、LOCATION および table_type 以外のプロパティを含む CREATE TABLE ステートメントは使用できません。

Delta Lake テーブルを読み込む

Delta Lake テーブルをクエリするには、次の標準 SQL SELECT 構文を使用します。

[ WITH with_query [, ...] ]SELECT [ ALL | DISTINCT ] select_expression [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ] [ HAVING condition ] [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ] [ ORDER BY expression [ ASC | DESC ] [ NULLS FIRST | NULLS LAST] [, ...] ] [ OFFSET count [ ROW | ROWS ] ] [ LIMIT [ count | ALL ] ]

SELECT 構文の詳細については、Athena ドキュメントの「SELECT」を参照してください。

Delta Lake 形式には、各データファイルの列ごとの最小値と最大値が格納されます。Athena では、この情報を利用して述語でのファイルスキップが可能になり、不要なファイルが考慮対象から除外されます。

Delta Lake メタデータの同期

Athena を使用して Delta Lake テーブルを作成する場合、Athena はスキーマ、パーティション列、およびテーブルプロパティなどのテーブルメタデータを含むテーブルメタデータを AWS Glue に同期します。時間が経過すると、このメタデータは、トランザクションログ内の基になるテーブルメタデータとの同期を失う可能性があります。テーブルを最新の状態に保つには、以下のいずれかのオプションを選択できます。

以下の機能を使用するには、AWS Glue スキーマがトランザクションログと常に同じスキーマである必要があることに注意してください。

  • Lake Formation

  • ビュー

  • 行フィルターと列フィルター

この機能がワークフローで必要なく、この互換性を維持しない場合は、Athena で CREATE TABLE DDL を使用し、AWS Glue で Amazon S3 パスを SerDe パラメータとして追加できます。

Athena と AWS Glue コンソールを使用して Delta Lake テーブルを作成するには
  1. https://console.aws.amazon.com/athena/ で Athena コンソールを開きます。

  2. Athena クエリエディタで、次の DDL を使用して Delta Lake テーブルを作成します。この方法を使用する場合、TBLPROPERTIES'table_type' = 'delta' ではなく 'spark.sql.sources.provider' = 'delta'の値はである必要があります。

    Apache Spark (Athena for Apache Spark) または他のほとんどのエンジンを使用してテーブルを作成すると、(タイプ array<string>col という名前の単一の列を含む) この同じスキーマが挿入されることに注意してください。

    CREATE EXTERNAL TABLE [db_name.]table_name(col array<string>) LOCATION 's3://DOC-EXAMPLE-BUCKET/your-folder/' TBLPROPERTIES ('spark.sql.sources.provider' = 'delta')
  3. https://console.aws.amazon.com/glue/ で AWS Glue コンソール を開きます。

  4. ナビゲーションペインで、[データカタログ][テーブル] を選択します。

  5. テーブルのリストで、目的のテーブルのリンクを選択します。

  6. テーブルのページで、[アクション][テーブルの編集] を選択します。

  7. [Serde パラメータ] セクションで、値 s3://DOC-EXAMPLE-BUCKET/your-folder/ を含むキー path を追加します。

  8. [Save] を選択します。

以下も参照してください。

AWS Glue での Delta Lake テーブルの使用および Athena でのそれらのクエリの説明については、AWS Big Data Blog の「Handle UPSERT data operations using open-source Delta Lake and AWS Glue」を参照してください。