オープンテーブル形式のサポート - Amazon EMR

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

オープンテーブル形式のサポート

Amazon EMR リリース 6.15.0 以降には、Spark SQL AWS Lake Formation でデータを読み書きするときに、Hive テーブル、Apache Iceberg、Apache Hudi、Delta Lake を使用した に基づくきめ細かなアクセスコントロールのサポートが含まれています。Amazon EMR は、Apache Hudi を使用した、テーブル、行、列、セルレベルのアクセスコントロールをサポートしています。Amazon EMR リリース 6.15.0 以上には、 AWS Lake Formation に基づく行、列、またはセルレベルでのきめ細かなアクセスコントロールのサポートが含まれています。EMR 7.12 以降、テーブルデータを変更する DML および DDL オペレーションは、Lake Formation が提供する認証情報を使用して Apache Hive、Apache Iceberg、および Delta Lake テーブルでサポートされています。

このセクションのトピックでは、EMR Spark ジョブまたはきめ細かなアクセスコントロールを備えたインタラクティブセッションから、オープンテーブル形式で Lake Formation 登録済みテーブルにアクセスする方法について説明します。

アクセス許可の要件

に登録されていないテーブル AWS Lake Formation

に登録されていないテーブルの場合 AWS Lake Formation、ジョブランタイムロールは Glue データカタログと Amazon AWS S3 の基盤となるテーブルデータの両方にアクセスします。 Amazon S3 これには、ジョブランタイムロールに Glue オペレーションと Amazon AWS S3 オペレーションの両方に対する適切な IAM アクセス許可が必要です。 Amazon S3

に登録されたテーブル AWS Lake Formation

に登録されたテーブルの場合 AWS Lake Formation、ジョブランタイムロールは AWS Glue データカタログメタデータにアクセスし、Lake Formation によって提供された一時的な認証情報は Amazon S3 の基盤となるテーブルデータにアクセスします。オペレーションの実行に必要な Lake Formation のアクセス許可は、Spark ジョブが開始する AWS Glue データカタログと Amazon S3 API コールに依存し、次のように要約できます。

  • DESCRIBE アクセス許可により、ランタイムロールは Data Catalog 内のテーブルまたはデータベースメタデータを読み取ることができます。

  • ALTER アクセス許可により、ランタイムロールは Data Catalog のテーブルまたはデータベースメタデータを変更できます。

  • DROP アクセス許可により、ランタイムロールは Data Catalog からテーブルまたはデータベースメタデータを削除できます。

  • SELECT アクセス許可により、ランタイムロールは Amazon S3 からテーブルデータを読み取ることができます。

  • INSERT アクセス許可により、ランタイムロールは Amazon S3 にテーブルデータを書き込むことができます。

  • DELETE アクセス許可により、ランタイムロールは Amazon S3 からテーブルデータを削除できます。

    注記

    Lake Formation は、Spark ジョブが AWS Glue を呼び出してテーブルメタデータを取得し、Amazon S3 を呼び出してテーブルデータを取得するときに、アクセス許可を遅延的に評価します。アクセス許可が不十分なランタイムロールを使用するジョブは、Spark が不足しているアクセス許可を必要とする AWS Glue または Amazon S3 呼び出しを行うまで失敗しません。

注記

次のサポートされているテーブルマトリックス:

  • サポート対象とマークされたオペレーションは、Lake Formation 認証情報のみを使用して、Lake Formation に登録されたテーブルのテーブルデータにアクセスします。Lake Formation のアクセス許可が不十分な場合、オペレーションはランタイムロールの認証情報にフォールバックしません。Lake Formation に登録されていないテーブルの場合、ジョブランタイムロールの認証情報はテーブルデータにアクセスします。

  • Amazon S3 ロケーションで IAM アクセス許可でサポートとマークされたオペレーションは、Amazon S3 の基盤となるテーブルデータにアクセスするために Lake Formation 認証情報を使用しません。これらのオペレーションを実行するには、テーブルが Lake Formation に登録されているかどうかにかかわらず、ジョブランタイムロールにテーブルデータにアクセスするために必要な Amazon S3 IAM アクセス許可が必要です。

Hive
運用 AWS Lake Formation アクセス許可 サポートステータス
SELECT SELECT サポート
CREATE TABLE CREATE_TABLE サポート
CREATE TABLE LIKE CREATE_TABLE Amazon S3 ロケーションでの IAM アクセス許可でサポート
CREATE TABLE AS SELECT CREATE_TABLE Amazon S3 ロケーションでの IAM アクセス許可でサポート
DESCRIBE TABLE DESCRIBE サポート
SHOW TBLPROPERTIES DESCRIBE サポート
SHOW COLUMNS DESCRIBE サポート
SHOW PARTITIONS DESCRIBE サポート
SHOW CREATE TABLE DESCRIBE サポート
テーブルの変更 tablename SELECT と ALTER サポート
テーブルtablenameセットの場所の変更 - サポートされていません
テーブルtablename追加パーティションの変更 SELECT、INSERT、ALTER サポート
REPAIR TABLE SELECT と ALTER サポート
データを読み込む サポートされていません
INSERT INSERT と ALTER サポート
INSERT OVERWRITE SELECT、INSERT、DELETE、ALTER サポート
DROP TABLE SELECT、DROP、DELETE、ALTER サポート
TRUNCATE TABLE SELECT、INSERT、DELETE、ALTER サポート
データフレームライター V1 対応する SQL オペレーションと同じ

既存のテーブルにデータを追加するときにサポートされます。詳細については、「考慮事項と制限事項」を参照してください。

データフレームライター V2 対応する SQL オペレーションと同じ

既存のテーブルにデータを追加するときにサポートされます。詳細については、「考慮事項と制限事項」を参照してください。

Iceberg
運用 AWS Lake Formation アクセス許可 サポートステータス
SELECT SELECT サポート
CREATE TABLE CREATE_TABLE サポート
CREATE TABLE LIKE CREATE_TABLE Amazon S3 ロケーションでの IAM アクセス許可でサポート
CREATE TABLE AS SELECT CREATE_TABLE Amazon S3 ロケーションでの IAM アクセス許可でサポート
テーブルを SELECT に置き換える SELECT、INSERT、ALTER サポート
DESCRIBE TABLE DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW TBLPROPERTIES DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW CREATE TABLE DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
ALTER TABLE SELECT、INSERT、ALTER サポート
ALTER TABLE SET LOCATION SELECT、INSERT、ALTER Amazon S3 ロケーションでの IAM アクセス許可でサポート
によって順序付けられたテーブルの書き込みを変更する SELECT、INSERT、ALTER Amazon S3 ロケーションでの IAM アクセス許可でサポート
によって分散されたテーブル書き込みを変更する SELECT、INSERT、ALTER Amazon S3 ロケーションでの IAM アクセス許可でサポート
テーブル名の変更テーブル CREATE_TABLE、および DROP サポート
INSERT INTO SELECT、INSERT、ALTER サポート
INSERT OVERWRITE SELECT、INSERT、ALTER サポート
DELETE SELECT、INSERT、ALTER サポート
UPDATE SELECT、INSERT、ALTER サポート
MERGE INTO SELECT、INSERT、ALTER サポート
DROP TABLE SELECT、DELETE、DROP サポート
DataFrame ライター V1 - サポートされていません
DataFrame ライター V2 対応する SQL オペレーションと同じ

既存のテーブルにデータを追加するときにサポートされます。詳細については、「考慮事項と制限事項」を参照してください。

メタデータテーブル SELECT サポート対象。特定のテーブルは非表示になります。詳細については、「考慮事項と制限事項」を参照してください。
ストアドプロシージャ - 次の条件を満たすテーブルでサポートされています。
  • に登録されていないテーブル AWS Lake Formation

  • register_table と を使用しないテーブル migrate

    詳細については、「考慮事項と制限事項」を参照してください。

Iceberg の Spark 設定: Iceberg 形式を使用する場合は、次の設定を行います。DB_LOCATION を Iceberg テーブルが置かれている Amazon S3 パスに置き換え、リージョンとアカウント ID のプレースホルダーを自分の使用する値に置き換えます。

spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION --conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.client.region=AWS_REGION

以前の EMR バージョンで Iceberg 形式を使用する場合は、代わりに以下のコマンドを使用します:

spark-sql \ --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.spark_catalog.warehouse=s3://DB_LOCATION --conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.client.assume-role.region=AWS_REGION --conf spark.sql.catalog.spark_catalog.lf.managed=true

例:

Iceberg テーブルの使用例をいくつか示します。

-- Create an Iceberg table CREATE TABLE my_iceberg_table ( id BIGINT, name STRING, created_at TIMESTAMP ) USING ICEBERG; -- Insert data INSERT INTO my_iceberg_table VALUES (1, 'Alice', current_timestamp()); -- Query the table SELECT * FROM my_iceberg_table;
Hudi
運用 AWS Lake Formation アクセス許可 サポートステータス
SELECT SELECT サポート
CREATE TABLE CREATE_TABLE Amazon S3 ロケーションでの IAM アクセス許可でサポート
CREATE TABLE LIKE CREATE_TABLE Amazon S3 ロケーションでの IAM アクセス許可でサポート
CREATE TABLE AS SELECT - サポートされていません
DESCRIBE TABLE DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW TBLPROPERTIES DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW COLUMNS DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW CREATE TABLE DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
ALTER TABLE SELECT Amazon S3 ロケーションでの IAM アクセス許可でサポート
INSERT INTO SELECT と ALTER Amazon S3 ロケーションでの IAM アクセス許可でサポート
INSERT OVERWRITE SELECT と ALTER Amazon S3 ロケーションでの IAM アクセス許可でサポート
DELETE - サポートされていません
UPDATE - サポートされていません
MERGE INTO - サポートされていません
DROP TABLE SELECT と DROP Amazon S3 ロケーションでの IAM アクセス許可でサポート
DataFrame ライター V1 - サポートされていません
DataFrame ライター V2 対応する SQL オペレーションと同じ Amazon S3 ロケーションでの IAM アクセス許可でサポート
メタデータテーブル - サポートされていません
テーブルのメンテナンスとユーティリティの機能 - サポートされていません

Hudi の Spark 設定:

EMR 7.10 以上のバージョンで Spark シェルを起動するには、以下のコマンドを使用します:

spark-sql --jars /usr/lib/hudi/hudi-spark-bundle.jar \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \ --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension

以前の EMR バージョンで Spark シェルを起動するには、代わりに以下のコマンドを使用します:

spark-sql --jars /usr/lib/hudi/hudi-spark-bundle.jar \ --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog \ --conf spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \ --conf spark.sql.catalog.spark_catalog.lf.managed=true

例:

Hudi テーブルの使用例をいくつか示します。

-- Create a Hudi table CREATE TABLE my_hudi_table ( id BIGINT, name STRING, created_at TIMESTAMP ) USING HUDI TBLPROPERTIES ( 'type' = 'cow', 'primaryKey' = 'id' ); -- Insert data INSERT INTO my_hudi_table VALUES (1, 'Alice', current_timestamp()); -- Query the latest snapshot SELECT * FROM my_hudi_table;

copy-on-writeテーブルの最新のスナップショットをクエリするには:

SELECT * FROM my_hudi_cow_table
spark.read.table("my_hudi_cow_table")

MOR テーブルの最新の圧縮データをクエリするには、読み取り最適化テーブル (サフィックス _ro 付き) に対するクエリを実行します。

SELECT * FROM my_hudi_mor_table_ro
spark.read.table("my_hudi_mor_table_ro")
Delta Lake
運用 AWS Lake Formation アクセス許可 サポートステータス
SELECT SELECT サポート
CREATE TABLE CREATE_TABLE サポート
CREATE TABLE LIKE - サポートされていません
CREATE TABLE AS SELECT CREATE_TABLE サポート
テーブルを SELECT に置き換える SELECT、INSERT、ALTER サポート
DESCRIBE TABLE DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW TBLPROPERTIES DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW COLUMNS DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
SHOW CREATE TABLE DESCRIBE Amazon S3 ロケーションでの IAM アクセス許可でサポート
ALTER TABLE SELECT と INSERT サポート
ALTER TABLE SET LOCATION SELECT と INSERT Amazon S3 ロケーションでの IAM アクセス許可でサポート
テーブルtablenameクラスターの変更 SELECT と INSERT Amazon S3 ロケーションでの IAM アクセス許可でサポート
テーブルtablename追加制約の変更 SELECT と INSERT Amazon S3 ロケーションでの IAM アクセス許可でサポート
テーブルtablenameドロップ制約の変更 SELECT と INSERT Amazon S3 ロケーションでの IAM アクセス許可でサポート
INSERT INTO SELECT と INSERT サポート
INSERT OVERWRITE SELECT と INSERT サポート
DELETE SELECT と INSERT サポート
UPDATE SELECT と INSERT サポート
MERGE INTO SELECT と INSERT サポート
DROP TABLE SELECT、DELETE、DROP サポート
DataFrame ライター V1 - サポートされていません
DataFrame ライター V2 対応する SQL オペレーションと同じ

サポート

テーブルのメンテナンスとユーティリティの機能 - サポートされていません

Delta Lake の Spark 設定:

EMR 7.10 以上で Lake Formation で Delta Lake を使用するには、以下のコマンドを実行します:

spark-sql \ --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog

EMR 6.15〜7.9 で Lake Formation で Delta Lake を使用するには、以下のコマンドを実行します:

spark-sql \ --conf spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension,com.amazonaws.emr.recordserver.connector.spark.sql.RecordServerSQLExtension \ --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog \ --conf spark.sql.catalog.spark_catalog.lf.managed=true

Lake Formation でレコードサーバーを使用して Spark カタログを管理する場合は、spark.sql.catalog.<managed_catalog_name>.lf.managed を true に設定します。

例:

Delta Lake テーブルの使用例をいくつか示します。

-- Create a Delta Lake table CREATE TABLE my_delta_table ( id BIGINT, name STRING, created_at TIMESTAMP ) USING DELTA; -- Insert data INSERT INTO my_delta_table VALUES (1, 'Alice', current_timestamp()); -- Query the table SELECT * FROM my_delta_table; -- Update data UPDATE my_delta_table SET name = 'Alice Smith' WHERE id = 1; -- Merge data MERGE INTO my_delta_table AS target USING (SELECT 2 as id, 'Bob' as name, current_timestamp() as created_at) AS source ON target.id = source.id WHEN MATCHED THEN UPDATE SET * WHEN NOT MATCHED THEN INSERT *;

AWS Glue データカタログでの Delta Lake テーブルの作成

Amazon EMR with Lake Formation は、7.12 より前の EMR リリースでの DDL コマンドと Delta テーブルの作成をサポートしていません。 AWS Glue データカタログにテーブルを作成するには、次の手順に従います。

  1. 次の例を使用して、Delta テーブルを作成します。S3 の場所が存在することを確認します。

    spark-sql \ --conf "spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension" \ --conf "spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog" > CREATE DATABASE if not exists <DATABASE_NAME> LOCATION 's3://<S3_LOCATION>/transactionaldata/native-delta/<DATABASE_NAME>/'; > CREATE TABLE <TABLE_NAME> (x INT, y STRING, z STRING) USING delta; > INSERT INTO <TABLE_NAME> VALUES (1, 'a1', 'b1');
  2. テーブルの詳細については、https://console.aws.amazon.com/glue/ を参照してください。

  3. 左側のナビゲーションで [データカタログ] を展開し、[テーブル] を選択し、作成したテーブルを選択します。Schema では、Spark で作成した Delta テーブルに、 Glue AWS のデータ型のすべての列が保存されていることがわかりarray<string>ます。

  4. Lake Formation で列とセルレベルのフィルターを定義するには、スキーマから col 列を削除し、テーブルスキーマにある列を追加します。この例では、列 xyz を追加します。

この機能を利用してコピーオンライトテーブルに対してスナップショットクエリを実行することで、特定のコミットまたは圧縮の瞬間におけるテーブルの最新のスナップショットをクエリすることができます。現在、Lake Formation 対応の Amazon EMR クラスターは、増分クエリとタイムトラベルクエリを実行するために Hudi のコミット時間列を取得する必要があります。Spark の timestamp as of 構文と Spark.read() 関数はサポートされていません。正しい構文は select * from table where _hoodie_commit_time <= point_in_time です。詳細については、「Point in time Time-Travel queries on Hudi table」を参照してください。

注記

Lake Formation クラスターでの読み取りのパフォーマンスは、最適化がサポートされていないために低くなる可能性があります。これらの機能には、Hudi メタデータに基づくファイルリストやデータスキップなどがあります。アプリケーションのパフォーマンスをテストして、要件を満たしているか確認することをお勧めします。