翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
オープンテーブル形式のサポート
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 コールに依存し、次のように要約できます。
-
DROP アクセス許可により、ランタイムロールは Data Catalog からテーブルまたはデータベースメタデータを削除できます。
-
SELECT アクセス許可により、ランタイムロールは Amazon S3 からテーブルデータを読み取ることができます。
-
INSERT アクセス許可により、ランタイムロールは Amazon S3 にテーブルデータを書き込むことができます。
-
DELETE アクセス許可により、ランタイムロールは Amazon S3 からテーブルデータを削除できます。
Lake Formation は、Spark ジョブが AWS Glue を呼び出してテーブルメタデータを取得し、Amazon S3 を呼び出してテーブルデータを取得するときに、アクセス許可を遅延的に評価します。アクセス許可が不十分なランタイムロールを使用するジョブは、Spark が不足しているアクセス許可を必要とする AWS Glue または Amazon S3 呼び出しを行うまで失敗しません。
- 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 データカタログにテーブルを作成するには、次の手順に従います。
-
次の例を使用して、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');
-
テーブルの詳細については、https://console.aws.amazon.com/glue/ を参照してください。
-
左側のナビゲーションで [データカタログ] を展開し、[テーブル] を選択し、作成したテーブルを選択します。Schema では、Spark で作成した Delta テーブルに、 Glue AWS のデータ型のすべての列が保存されていることがわかりarray<string>ます。
-
Lake Formation で列とセルレベルのフィルターを定義するには、スキーマから col 列を削除し、テーブルスキーマにある列を追加します。この例では、列 x、y、z を追加します。
この機能を利用してコピーオンライトテーブルに対してスナップショットクエリを実行することで、特定のコミットまたは圧縮の瞬間におけるテーブルの最新のスナップショットをクエリすることができます。現在、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 メタデータに基づくファイルリストやデータスキップなどがあります。アプリケーションのパフォーマンスをテストして、要件を満たしているか確認することをお勧めします。