View a markdown version of this page

支援開放式資料表格式 - Amazon EMR

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

支援開放式資料表格式

當您使用 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 支援
更改資料表 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 支援
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 格式,請設定下列組態。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 - 不支援
合併為 - 不支援
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 * 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、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 中建立資料表。

  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://https://console.aws.amazon.com/glue/

  3. 在左側導覽中,展開 Data Catalog,選擇資料表,然後選擇您建立的資料表。在結構描述下,您應該會看到您使用 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。如需詳細資訊,請參閱 Hudi 資料表上的時間歷程查詢

注意

由於不支援優化,Lake Formation 叢集上的讀取效能可能會變慢。這些功能包括基於 Hudi 中繼資料的檔案清單和資料略過。建議您測試應用程式效能,以確保符合您的要求。