本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Glue AWS 中使用 Delta Lake 架構
AWS Glue 3.0 和更新版本支援 Linux Foundation Delta Lake 架構。Delta Lake 是開放原始碼資料湖儲存架構,可協助您執行 ACID 交易、擴充中繼資料處理,以及統一串流與批次資料處理。本主題涵蓋在 Delta Lake AWS 資料表中傳輸或存放資料時,在 Glue 中使用資料的可用功能。若要進一步了解 Delta Lake,請參閱官方 Delta Lake 文件
您可以使用 AWS Glue 在 Amazon S3 中的 Delta Lake 資料表上執行讀取和寫入操作,或使用 Glue Data Catalog 使用 Delta Lake AWS 資料表。插入、更新和資料表批次讀取和寫入DeltaTable.forPath
。如需 Delta Lake Python 程式庫的詳細資訊,請參閱 Delta Lake 的 Python 文件。
下表列出每個 Glue 版本中包含的 Delta Lake AWS 版本。
AWS Glue 版本 | 支援的 Delta Lake 版本 |
---|---|
5.0 | 3.2.1 |
4.0 | 2.1.0 |
3.0 | 1.0.0 |
若要進一步了解 AWS Glue 支援的資料湖架構,請參閱 搭配 AWS Glue ETL 任務使用資料湖架構。
啟用 Delta Lake for AWS Glue
若要啟用 Delta Lake for AWS Glue,請完成下列任務:
-
指定
delta
作為--datalake-formats
任務參數的值。如需詳細資訊,請參閱在 Glue AWS 任務中使用任務參數。 -
為您的 Glue 任務建立名為 AWS
--conf
的金鑰,並將其設定為下列值。您也可以選擇在指令碼中使用SparkConf
設定以下組態。這些設定有助於 Apache Spark 正確處理 Delta Lake 資料表。spark.sql.extensions=io.delta.sql.DeltaSparkSessionExtension --conf spark.sql.catalog.spark_catalog=org.apache.spark.sql.delta.catalog.DeltaCatalog --conf spark.delta.logStore.class=org.apache.spark.sql.delta.storage.S3SingleDriverLogStore
Delta 資料表的 Lake Formation AWS 許可支援預設為針對 Glue 4.0 啟用。讀取/寫入 Lake Formation 註冊的 Delta 資料表時,不需要其他組態。若要讀取已註冊的 Delta AWS 資料表,Glue 任務 IAM 角色必須具有 SELECT 許可。若要寫入已註冊的 Delta AWS 資料表,Glue 任務 IAM 角色必須具有 SUPER 許可。若要進一步了解管理 Lake Formation 權限的資訊,請參閱授予和撤銷 Data Catalog 資源的權限。
使用不同的 Delta Lake 版本
若要使用 AWS Glue 不支援的 Delta lake 版本,請使用--extra-jars
任務參數指定您自己的 Delta Lake JAR 檔案。請勿包括 delta
作為 --datalake-formats
任務參數的值。若要在此案例中使用 Delta Lake Python 程式庫,您必須使用 --extra-py-files
任務參數指定程式庫 JAR 檔案。Python 程式庫封裝在 Delta Lake JAR 檔案中。
範例:將 Delta Lake 資料表寫入 Amazon S3,並將其註冊至 AWS Glue Data Catalog
下列 AWS Glue ETL 指令碼示範如何將 Delta Lake 資料表寫入 Amazon S3,並將資料表註冊至 AWS Glue Data Catalog。
範例:使用 Glue Data Catalog 從 Amazon S3 AWS 讀取 Delta Lake 資料表
下列 AWS Glue ETL 指令碼會讀取您在 中建立的 Delta Lake 資料表範例:將 Delta Lake 資料表寫入 Amazon S3,並將其註冊至 AWS Glue Data Catalog。
範例:使用 AWS Glue Data Catalog 將 DataFrame
插入 Amazon S3 中的 Delta Lake 資料表
此範例會將資料插入您在 範例:將 Delta Lake 資料表寫入 Amazon S3,並將其註冊至 AWS Glue Data Catalog 中建立的 Delta Lake 資料表中。
注意
此範例需要您設定--enable-glue-datacatalog
任務參數,以使用 AWS Glue Data Catalog 做為 Apache Spark Hive 中繼存放區。如需進一步了解,請參閱 在 Glue AWS 任務中使用任務參數。
範例:使用 Spark API 從 Amazon S3 讀取 Delta Lake 資料表
此範例使用 Spark API 從 Amazon S3 讀取 Delta Lake 資料表。
範例:使用 Spark 將 Delta Lake 資料表寫入 Amazon S3
此範例會使用 Spark 將 Delta Lake 資料表寫入 Amazon S3。
範例:使用 Lake Formation 權限控制讀取和寫入 Delta Lake 資料表
此範例會讀取和寫入具有 Lake Formation 權限控制的 Delta Lake 資料表。
-
建立 Delta 資料表,並在 Lake Formation 中進行註冊
-
若要啟用 Lake Formation 權限控制,您將需要先在 Lake Formation 中註冊資料表 Amazon S3 路徑。如需詳細資訊,請參閱 Registering an Amazon S3 location (註冊 Amazon S3 位置)。您可以從 Lake Formation 主控台或使用 CLI AWS 註冊:
aws lakeformation register-resource --resource-arn arn:aws:s3:::<s3-bucket>/<s3-folder> --use-service-linked-role --region <REGION>
註冊 Amazon S3 位置後,指向該位置 (或其任何子位置) 的任何 AWS Glue 資料表都會在
GetTable
呼叫中傳回IsRegisteredWithLakeFormation
參數的值為 true。 -
建立透過 Spark 指向註冊之 Amazon S3 路徑的 Delta 資料表:
注意
下列為 Python 範例。
dataFrame.write \ .format("delta") \ .mode("overwrite") \ .partitionBy("<your_partitionkey_field>") \ .save("s3://<the_s3_path>")
將資料寫入 Amazon S3 之後,請使用 AWS Glue 爬蟲程式建立新的 Delta 目錄資料表。如需詳細資訊,請參閱使用 Glue 爬蟲程式介紹原生 Delta Lake AWS 資料表支援
。 您也可以透過 Glue
CreateTable
API AWS 手動建立資料表。
-
授予 Lake Formation 許可給 AWS Glue 任務 IAM 角色。您可以從 Lake Formation 主控台授予許可,或使用 AWS CLI。如需詳細資訊,請參閱使用 Lake Formation 主控台和具名資源方法授予資料表權限。
讀取在 Lake Formation 中註冊的 Delta 資料表。該程式碼與讀取未註冊之 Delta 資料表的程式碼相同。請注意,Glue AWS 任務 IAM 角色需要具有 SELECT 許可,才能成功讀取。
# Example: Read a Delta Lake table from Glue Data Catalog df = glueContext.create_data_frame.from_catalog( database="<your_database_name>", table_name="<your_table_name>", additional_options=additional_options )
-
寫入在 Lake Formation 中註冊的 Delta 資料表。該程式碼與寫入未註冊之 Delta 資料表的程式碼相同。請注意,Glue AWS 任務 IAM 角色需要具有 SUPER 許可才能成功寫入。
根據預設,Glue AWS 會使用
Append
做為 saveMode。您可以透過設定additional_options
中的 saveMode 選項進行變更。如需有關 Delta 資料表之 saveMode 支援的資訊,請參閱寫入資料表。 glueContext.write_data_frame.from_catalog( frame=dataFrame, database="<your_database_name>", table_name="<your_table_name>", additional_options=additional_options )