本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
支援開放式資料表格式
當您使用 Spark SQL 讀取和寫入資料時,Amazon EMR 6.15.0 版和更新版本包括支援以 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 開始,使用 Lake Formation 提供的登入資料,Apache Hive、Apache Iceberg 和 Delta Lake 資料表支援修改資料表資料的 DML 和 DDL 操作。
本節中的主題涵蓋如何透過 EMR Spark 任務或具有精細存取控制的互動式工作階段,以開放資料表格式存取 Lake Formation 註冊的資料表。
許可要求
資料表未在 中註冊 AWS Lake Formation
對於未向 註冊的資料表 AWS Lake Formation,任務執行期角色會同時存取 AWS Glue Data Catalog 和 Amazon S3 中的基礎資料表資料。這需要任務執行期角色才能同時擁有 Glue 和 Amazon S3 AWS 操作的適當 IAM 許可。
在 中註冊的資料表 AWS Lake Formation
對於向 註冊的資料表 AWS Lake Formation,任務執行時間角色會存取 AWS Glue Data Catalog 中繼資料,而 Lake Formation 提供的臨時憑證則會存取 Amazon S3 中的基礎資料表資料。執行 操作所需的 Lake Formation 許可取決於 Spark 任務啟動的 AWS Glue Data Catalog 和 Amazon S3 API 呼叫,可以摘要如下:
-
DESCRIBE 許可允許執行期角色讀取 Data Catalog 中的資料表或資料庫中繼資料
-
ALTER 許可允許執行期角色修改 Data Catalog 中的資料表或資料庫中繼資料
-
DROP 許可允許執行時間角色從 Data Catalog 刪除資料表或資料庫中繼資料
-
SELECT 許可允許執行期角色從 Amazon S3 讀取資料表資料
-
INSERT 許可允許執行期角色將資料表資料寫入 Amazon S3
-
DELETE 許可允許執行時間角色從 Amazon S3 刪除資料表資料
注意
當 Spark 任務呼叫 AWS Glue 擷取資料表中繼資料和 Amazon S3 擷取資料表資料時,Lake Formation 會延遲評估許可。在 Spark 進行需要缺少許可的 AWS Glue 或 Amazon S3 呼叫之前,使用執行時間角色且許可不足的任務不會失敗。
注意
在下列支援的資料表矩陣中:
-
標示為 Supported 的操作只會使用 Lake Formation 登入資料來存取向 Lake Formation 註冊之資料表的資料表資料。如果 Lake Formation 許可不足,操作將不會回復為執行時間角色登入資料。對於未向 Lake Formation 註冊的資料表,任務執行期角色登入資料會存取資料表資料。
-
在 Amazon S3 位置上標記為支援 IAM 許可的操作不會使用 Lake Formation 登入資料來存取 Amazon S3 中的基礎資料表資料。若要執行這些操作,任務執行期角色必須具有存取資料表資料所需的 Amazon S3 IAM 許可,無論資料表是否已向 Lake Formation 註冊。
- 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 支援 更改資料表 tablenameSELECT 和 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 支援 Dataframe Writer V1 與對應的 SQL 操作相同 將資料附加至現有資料表時支援。如需詳細資訊,請參閱考量事項和限制
Dataframe Writer 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 支援 合併為 SELECT、INSERT 和 ALTER 支援 DROP TABLE SELECT、DELETE 和 DROP 支援 DataFrame 寫入器 V1 - 不支援 DataFrame 寫入器 V2 與對應的 SQL 操作相同 將資料附加至現有資料表時支援。如需詳細資訊,請參閱考量事項和限制。
中繼資料表 SELECT 支援。某些資料表會隱藏。如需詳細資訊,請參閱考量事項和限制。 預存程序 - 支援符合下列條件的資料表: -
資料表未在 中註冊 AWS Lake Formation
-
不使用
register_table和 的資料表migrate如需詳細資訊,請參閱考量事項和限制。
Iceberg 的 Spark 組態:如果您想要使用 Iceberg 格式,請設定下列組態。
將 取代為 Iceberg 資料表所在的 Amazon S3 路徑,並將區域和帳戶 ID 預留位置取代為您自己的值。DB_LOCATIONspark-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 - 不支援 合併為 - 不支援 DROP TABLE SELECT 和 DROP 在 Amazon S3 位置上支援 IAM 許可 DataFrame 寫入器 V1 - 不支援 DataFrame 寫入器 V2 與對應的 SQL 操作相同 在 Amazon S3 位置上支援 IAM 許可 中繼資料表 - 不支援 資料表維護和公用程式功能 - 不支援 Hudi 的 Spark 組態:
若要在 EMR 7.10 或更新版本上啟動 Spark shell,請使用下列命令:
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 shell,請改用下列命令:
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 * FROMmy_hudi_cow_tablespark.read.table("my_hudi_cow_table")若要查詢
MOR資料表的最新壓縮資料,您可以查詢字尾為_ro的讀取優化資料表:SELECT * FROMmy_hudi_mor_table_rospark.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、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 支援 合併為 SELECT 和 INSERT 支援 DROP TABLE SELECT、DELETE 和 DROP 支援 DataFrame 寫入器 V1 - 不支援 DataFrame 寫入器 V2 與對應的 SQL 操作相同 支援
資料表維護和公用程式功能 - 不支援 Delta Lake 的 Spark 組態:
若要在 EMR 7.10 及更高版本上使用 Delta Lake 搭配 Lake Formation,請執行下列命令:
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 上使用 Delta Lake 搭配 Lake Formation,請執行下列動作
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 Data Catalog 中建立 Delta Lake 資料表
Amazon EMR with Lake Formation 不支援在 7.12 之前的 EMR 版本中建立 DDL 命令和 Delta 資料表。請依照下列步驟,在 Glue Data Catalog AWS 中建立資料表。
-
使用下列範例來建立 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://https://console.aws.amazon.com/glue/
。 -
在左側導覽中,展開 Data Catalog,選擇資料表,然後選擇您建立的資料表。在結構描述下,您應該會看到您使用 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。如需詳細資訊,請參閱 Hudi 資料表上的時間歷程查詢
注意
由於不支援優化,Lake Formation 叢集上的讀取效能可能會變慢。這些功能包括基於 Hudi 中繼資料的檔案清單和資料略過。建議您測試應用程式效能,以確保符合您的要求。