使用 Amazon Athena SQL 與阿帕奇冰山表 - AWS 規定指引

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

使用 Amazon Athena SQL 與阿帕奇冰山表

Amazon Athena 為 Apache 冰山提供內建支援,不需要額外的步驟或設定。本節提供支援功能的詳細概觀,以及使用 Athena 與 Iceberg 資料表互動的高階指引。

版本和功能兼容性

注意

以下各節假設您使用的是 Athena 引擎第 3 版

冰山表規格支持

Apache 的冰山表規範指定了冰山表應該如何行為。Athena 支援資料表格式第 2 版,因此您使用主控台、CLI 或 SDK 建立的任何 Iceberg 表格本質上都會使用該版本。

如果您使用與另一個引擎(例如 Amazon EMR 上的 Apache Spark)創建的冰山表 AWS Glue,或者確保使用表屬性設置表格式版本。作為參考,請參閱本指南前面的創建和編寫 Iceberg 表一節。

冰山功能支持

您可以使用 Athena 來讀取和寫入冰山表。當您使用UPDATEMERGE INTODELETE FROM陳述式變更資料時,Athena 僅支援 merge-on-read 模式。無法變更此屬性。為了更新或刪除數據 copy-on-write,你必須使用其他引擎,如阿帕奇星火在 Amazon EMR 或 AWS Glue. 下表總結了 Athena 的冰山功能支援。

支援 DDL DML 支援 AWS Lake Formation 為了安全(可選)
資料表格式 建立資料表 結構描述演進 讀取資料 寫入資料 列/欄存取控制
Amazon Athena 2 版 X C opy-on-write
✓ 米 erge-on-read
注意

Athena 不支援增量查詢。

使用冰山桌

如需在 Athena 使用冰山的快速入門,請參閱本指南稍早的 A thena SQL 中的「開始使用冰山表」一節。

下表列出限制和建議。

情況

限制

建議

產生資料表 DDL

使用其他引擎建立的冰山表格可能具有未暴露在 Athena 中的屬性。對於這些表格,無法產生 DDL。

在建立資料表的引擎中使用對等陳述式 (例如 Spark SHOW CREATE TABLE 陳述式)。

寫入冰山表的對象中的隨機 Amazon S3 前綴

依預設,使用 Athena 建立的冰山表格會啟用write.object-storage.enabled屬性。

要禁用此行為並獲得對冰山表屬性的完全控制,請使用另一個引擎(例如 Amazon EMR 上的 Spark)創建一個冰山表或。 AWS Glue

增量查詢

Athena 目前不支援。

若要使用增量查詢來啟用增量資料擷取管道,請使用 Amazon EMR 上的 Spark 或. AWS Glue

將現有的表遷移到冰山

若要將目前的 Athena 或資料 AWS Glue 表 (也稱為 Hive 資料表) 遷移為 Iceberg 格式,您可以使用就地或完整資料遷移:

  • 就地遷移是在現有數據文件之上生成 Iceberg 的元數據文件的過程。

  • 完整資料遷移會建立 Iceberg 中繼資料層,並將現有資料檔案從原始資料表重新寫入新的 Iceberg 資料表。

下列各節提供可用於移轉表格的 API 概觀,以及選擇移轉策略的指引。有關這兩種策略的更多信息,請參閱 Iceberg 文檔中的表遷移部分。

就地移轉

就地移轉不需要重新寫入所有資料檔案。而是會產生 Iceberg 中繼資料檔案,並將其連結至您現有的資料檔案。Iceberg 提供了三種實施就地遷移的選項:

目前,遷移過程不能直接與 AWS Glue Data Catalog-它僅適用於 Hive 中繼存儲。如果您需要使用migrate程序而非snapshotadd_files,則可以將臨時 Amazon EMR 叢集與 Hive 中繼存放區 (HMS) 搭配使用。這種方法需要冰山版本 1.2 或更高版本。

假設您要創建以下 Hive 表:

將蜂巢表遷移到 Amazon Athena

您可以在 Athena 主控台中執行此程式碼,以建立此 Hive 資料表:

CREATE EXTERNAL TABLE 'hive_table'( 'id' bigint, 'data' string) USING parquet LOCATION 's3://datalake-xxxx/aws_workshop/iceberg_db/hive_table' INSERT INTO iceberg_db.hive_table VALUES (1, 'a')

如果您的 Hive 表被分區,包括分區語句,並根據 Hive 要求添加分區。

ALTER TABLE default.placeholder_table_for_migration ADD PARTITION (date = '2023-10-10')

步驟:

  1. 在不啟用 AWS Glue Data Catalog 整合的情況下建立 Amazon EMR 叢集,也就是說,請勿選取 Hive 或 Spark 表格中繼資料的核取方塊。這是因為您將使用叢集中可用的原生 Hive 中繼存放區 (HMS) 來進行此因應措施。

    AWS Glue Data Catalog 沒有蜂巢或星火元數據的設置
  2. 設定 Spark 工作階段以使用冰山蜂巢目錄實作。

    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.spark_catalog": "org.apache.iceberg.spark.SparkSessionCatalog", "spark.sql.catalog.spark_catalog.type": "hive",
  3. AWS Glue Data Catalog 透過執行show databasesshow tables,驗證您的 Amazon EMR 叢集未連線到。

    驗證 Amazon EMR 叢集未連接到 AWS Glue Data Catalog
  4. 在 Amazon EMR 叢集的 Hive 中繼存放區中註冊 Hive 表格,然後使用冰山migrate程序。

    冰山遷移程序

    此程序會在與 Hive 資料表相同的位置建立 Iceberg 中繼資料檔案。

  5. 在中註冊已移轉的冰山表格。 AWS Glue Data Catalog

  6. 切換回已啟用 AWS Glue Data Catalog 整合的 Amazon EMR 叢集。

    AWS Glue Data Catalog 使用星火中繼資料的
  7. 在 Spark 會話中使用以下冰山配置。

    "spark.sql.extensions":"org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.glue_catalog": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.glue_catalog.warehouse": "s3://datalake-xxxx/aws_workshop", "spark.sql.catalog.glue_catalog.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.glue_catalog.io-impl": "org.apache.iceberg.aws.s3.S3FileIO",

您現在可以從 Amazon EMR, AWS Glue或 Athena 查詢此表。

顯示冰山表的表命令

完整資料遷移

完整資料移轉會重新建立資料檔案以及中繼資料。與就地遷移相比,此方法需要更長的時間並且需要額外的計算資源 不過,此選項有助於改善表格品質:您可以驗證資料、進行結構描述和分割區變更、處理資料等等。若要實作完整資料移轉,請使用下列其中一個選項:

  • 在 Amazon EMR 上的星火中使用CREATE TABLE ... AS SELECT(CTA)聲明 AWS Glue,或 Athena。  您可以使用 AND TBLPROPERTIES 子句,為新的 Iceberg 資料表設定分割區規格PARTITIONED BY和資料表屬性。您可以根據需要微調結構定義和分割新資料表,而不是直接從來源資料表繼承它們。

  • 從來源資料表中讀取資料,並使用 Amazon EMR 上的 Spark 或將資料寫入為新的冰山資料表 AWS Glue (請參閱 Iceberg 文件中的建立資料表)。

選擇移轉策略

若要選擇最佳的移轉策略,請考慮下表中的問題。

問題

建議

什麼是數據文件格式(例如,CSV 或阿帕奇木地板)?

  • 如果您的表格檔案格式為「實木地板」、「ORC」或「Avro」,請考慮就地移轉。

  • 對於 CSV、JSON 等其他格式,請使用完整資料遷移。

是否要更新或合併資料表結構定義?

  • 如果您想要使用 Iceberg 原生功能來演進資料表結構定義,請考慮就地移轉。例如,您可以在移轉後重新命名資料行。(可以在 Iceberg 元數據層中更改模式。)

  • 如果您要刪除資料檔案中的整個資料行,建議您使用完整的資料移轉。

資料表是否會因改變分割區策略而受益?

  • 如果 Iceberg 的分割方法符合您的需求 (例如,使用新的分割區配置儲存新資料,而現有的分割區保持原樣),請考慮就地遷移。

  • 如果您想要在資料表中使用隱藏的分割區,請考慮進行完整的資料遷移。如需有關隱藏分割區的詳細資訊,請參閱最佳做法一節。

表格會受益於新增或變更排序順序策略嗎?

  • 新增或變更資料的排序順序需要重寫資料集。在此情況下,請考慮使用完整資料移轉。

  • 對於重新寫入所有資料表分割區的大型資料表而言,請考慮使用就地移轉,並針對最常存取的磁碟分割執行壓縮 (啟用排序功能)。

表格是否有許多小檔案?

  • 將小文件合併為較大的文件需要重寫數據集。在此情況下,請考慮使用完整資料移轉。

  • 對於重新寫入所有資料表分割區的大型資料表而言,請考慮使用就地移轉,並針對最常存取的磁碟分割執行壓縮 (啟用排序功能)。