搭配使用 Athena 時的最佳做法 AWS Glue - Amazon Athena

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

搭配使用 Athena 時的最佳做法 AWS Glue

搭配使用 Athena 時 AWS Glue Data Catalog,您可以使用建立 AWS Glue 要在 Athena 中查詢的資料庫和表格 (結構描述),或者您可以使用 Athena 建立結構描述,然後在 AWS Glue 和相關服務中使用它們。本主題提供使用這兩個方法時的考量和最佳實務。

背後原理是,Athena 使用 Trino 來處理 DML 陳述式,並使用 Hive 來處理負責建立和修改結構描述的 DDL 陳述式。有了這些技術,有幾個慣例遵循,以便 Athena 和一起 AWS Glue 工作良好。

在本主題中

資料庫、資料表和資料欄名稱

在中建立結構描述以 AWS Glue 便在 Athena 中進行查詢時,請考慮下列事項:

  • 中的資料庫名稱、表格名稱和欄名稱可接受的字元 AWS Glue 必須是 UTF-8 字串,且應小寫。請注意,Athena 會在建立資料庫、資料表或資料行時,自動降低 DDL 查詢中的任何大寫字母名稱。字串長度不得小於 1 或超過 255 個位元組。可以使用的字元包括空格。

  • 目前,名稱開頭可能有前導空格。由於這些前導空格很難偵測,而且在建立之後可能會造成可用性問題,因此請避免意外建立含有前導空格的物件名稱。

  • 如果您使用AWS::Glue::Database AWS CloudFormation 範本來建立資 AWS Glue 料庫,但未指定資料庫名稱,則會 AWS Glue 自動產生與 Athena 不相容的資料庫名稱 — random_string 格式的資料庫名稱。

  • 您可以使用「目 AWS Glue 錄管理員」更名欄,但無法更名表格名稱或資料庫名稱。若要解決此限制,您必須使用舊資料庫的定義,建立具有新名稱的資料庫。然後,您可以使用舊資料庫中資料表的定義,重新建立新資料庫中的資料表。若要這麼做,您可以使用 AWS CLI 或 AWS Glue SDK。如需這些步驟,請參閱 使用重新 AWS CLI 建立 AWS Glue 資料庫及其表格

如需有關中的資料庫和表格的詳細資訊 AWS Glue,請參閱AWS Glue 開發人員指南中的資料庫表格

使用 AWS Glue 爬蟲

AWS Glue 搜尋器可協助探索資料集的結構描述,並將其註冊為「 AWS Glue 資料目錄」中的資料表。爬蟲程式可逐一瀏覽您的資料,並判斷結構描述。此外,爬蟲程式可偵測和登錄分割區。如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的定義爬蟲程式。可從 Athena 查詢來自已成功編目的資料的資料表。

注意

Athena 無法辨識您為 AWS Glue 爬行者程式指定的排除模式。例如,如果您的 Simple Storage Service (Amazon S3) 儲存貯體同時包含 .csv.json 檔案,並且您將 .json 檔案從爬蟲程式中排除,Athena 會查詢這兩個檔案群組。若要避免這種情況,請將您要排除的檔案放在不同的位置。

排程爬蟲程式以保持 AWS Glue Data Catalog 和 Amazon S3 同步

AWS Glue 爬行者程式可以設定為按排程或按需執行。如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的任務和爬蟲程式的時間排程

如果您有固定時間送達分區資料表的資料,您可以設定 AWS Glue 爬行者程式按排程執行,以偵測和更新表格分割區。您不再需要花費大量時間和金錢執行 MSCK REPAIR 命令,也不需要再手動執行 ALTER TABLE ADD PARTITION 命令。如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的資料表分割區

對爬蟲程式使用多個資料來源

當 AWS Glue 爬行者程式掃描 Amazon S3 並偵測到多個目錄時,它會使用啟發式來判斷表格的根目錄在目錄結構中的位置,以及哪些目錄是表格的分割區。在某些情況下,在兩個或多個目錄偵測到類似的結構描述時,爬蟲程式可能會將它們視為分割區,而不是個別的資料表。協助爬蟲程式探索個別資料表的其中一種方法是,將每個資料表的根目錄新增為爬蟲程式的資料存放區。

Amazon S3 中的下列分割區為範例:

s3://DOC-EXAMPLE-BUCKET/folder1/table1/partition1/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table1/partition2/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table1/partition3/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table2/partition4/file.txt s3://DOC-EXAMPLE-BUCKET/folder1/table2/partition5/file.txt

如果 table1table2 的結構描述類似,並且 AWS Glue中的單一資料來源設定為 s3://DOC-EXAMPLE-BUCKET/folder1/,則爬蟲程式可能會建立具有兩個分割區資料欄的單一資料表:一個分割區資料欄包含 table1table2,第二個分割區資料欄包含 partition1partition5

若要讓 AWS Glue 爬行者程式建立兩個個別的表格,請將爬行者程式設定為具有兩個資料來源s3://DOC-EXAMPLE-BUCKET/folder1/table2s3://DOC-EXAMPLE-BUCKET/folder1/table1/並如下列程序所示。

若要將 S3 資料存放區新增至中的現有爬行者程式 AWS Glue

  1. 請登入 AWS Management Console 並開啟 AWS Glue 主控台,網址為 https://console.aws.amazon.com/glue/

  2. 在導覽窗格中,選擇 Crawlers (爬蟲程式)。

  3. 選擇您的爬蟲程式連結,然後選擇 Edit (編輯)。

  4. 對於 Step 2: Choose data sources and classifiers (步驟 2:選擇資料來源和分類器),選擇 Edit (編輯)。

  5. 對於 Data sources (資料來源),選擇 Add a data source (新增資料來源)。

  6. Add data source (新增資料來源) 對話方塊中,用於S3 path (S3 路徑),選擇 Browse (瀏覽)。

  7. 選取您想要使用的儲存貯體,然後選擇 Choose (選擇)。

    您新增的資料來源會顯示在 Data sources (資料來源)的清單中。

  8. 選擇下一步

  9. Configure Security Settings (設定安全設定) 頁面上,建立或選擇爬蟲程式的 IAM 角色,然後選擇Next (下一步)

  10. 確定 S3 路徑結尾為尾端斜線,然後選擇 Add an S3 data source (新增 S3 資料來源)。

  11. Set output and scheduling (設定輸出與排程) 頁面上,針對 Output configuration (輸出組態),選擇目標資料庫。

  12. 選擇下一步

  13. Review (檢閱和更新) 頁面上,檢閱您所做的選擇。若要編輯步驟,請選擇 Edit (編輯)。

  14. 選擇更新

同步分割區結構描述以避免 "HIVE_PARTITION_SCHEMA_MISMATCH"

對於具有分割區 AWS Glue 資料行的「資料目錄」中的每個表格,結構定義會儲存在表格層級以及表格中的每個個別分割區。 AWS Glue 爬行者程式會根據分割區內讀取的資料樣本,填入分割區的結構描述。如需詳細資訊,請參閱 對爬蟲程式使用多個資料來源

當 Athena 執行查詢時,會驗證資料表的結構描述,以及查詢所需的任何分割區的結構描述。驗證會依序比較資料欄資料類型,並確認它們符合重疊的資料欄。這可避免意外的操作,例如從資料表中間新增或移除資料欄。如果 Athena 偵測到分割區的結構描述與資料表的結構描述不同,Athena 可能無法處理查詢,並且會在 HIVE_PARTITION_SCHEMA_MISMATCH 時操作失敗。

您有一些方式可以修正這個問題。首先,如果資料是意外新增,您可以移除造成結構描述中差異的資料檔案,捨棄分割區,並重新編目資料。第二,您可以捨棄個別分割區,然後在 Athena 內執行 MSCK REPAIR,以使用資料表的結構描述重新建立分割區。這個第二個選項只有在您確定套用的結構描述將可繼續正確讀取資料時才適用。

更新資料表中繼資料

AWS Glue 搜索之後,爬行者程式會自動指派特定資料表中繼資料,以協助使其與 Apache Hive、Presto 和 Spark 等其他外部技術相容。有時爬蟲程式可能不正確地指派中繼資料屬性。在使用 Athena 查詢資料表之 AWS Glue 前,請手動更正中的屬性。如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的檢視與編輯資料表詳細資訊

AWS Glue 當 CSV 檔案在每個資料欄位周圍都有引號時,可能會錯誤地指派中繼資料,導致serializationLib屬性錯誤。如需詳細資訊,請參閱 CSV 資料含括在引號中

使用 CSV 檔案

CSV 檔案中的資料值偶爾會有引號,目的是用於每個資料欄,並且 CSV 檔案可能會包含會標頭值,它不是要分析之資料的一部分。當您使用 AWS Glue 從這些檔案建立結構描述時,請遵循本節中的指導。

CSV 資料含括在引號中

您可能有一個 CSV 檔案,其中的資料欄位以雙引號括住,如下列範例所示:

"John","Doe","123-555-1231","John said \"hello\"" "Jane","Doe","123-555-9876","Jane said \"hello\""

若要在 Athena 中對使用引號值的 CSV 檔案建立的資料表執行查詢,您必須修改中的資料表屬性 AWS Glue 才能使用 OpenCSV SerDe。如需 OpenCSV 的詳細資訊 SerDe,請參閱SerDe 用於處理 CSV 的開啟 CSV

在 AWS Glue 主控台中編輯表格屬性的步驟
  1. 在 AWS Glue 主控台瀏覽窗格中,選擇 [格]。

  2. 選擇您想要編輯的資料表連結,然後選擇 Action (動作)、Edit table (編輯資料表)。

  3. Edit table (編輯資料表) 頁面上,進行下列變更:

    • 對於 Serialization lib (序列化程式庫),請輸入 org.apache.hadoop.hive.serde2.OpenCSVSerde

    • 對於 Serde parameters (SerDe 參數),請輸入金鑰 escapeCharquoteChar 以及 separatorChar 的值:

      • 對於 escapeChar,請輸入反斜線 (\)。

      • 對於 quoteChar,請輸入雙引號 (")。

      • 對於 separatorChar,請輸入逗號 (,)。

  4. 選擇儲存

如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的檢視與編輯資料表詳細資訊

以程式設計方式更新 AWS Glue

您可以使用 AWS Glue UpdateTableAPI 作業或更新資料表 CLI 命令來修改資料表定義中的SerDeInfo區塊,如下列範例 JSON 所示。

"SerDeInfo": { "name": "", "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde", "parameters": { "separatorChar": "," "quoteChar": "\"" "escapeChar": "\\" } },

具有標頭的 CSV 檔案

當您在 Athena 中以 CREATE TABLE 陳述式定義資料表時,您可以使用 skip.header.line.count 資料表屬性忽略 CSV 資料中的標頭,如下列範例所示。

... STORED AS TEXTFILE LOCATION 's3://DOC-EXAMPLE-BUCKET/csvdata_folder/'; TBLPROPERTIES ("skip.header.line.count"="1")

或者,您也可以事先移除 CSV 標頭,使標頭資訊不包含在 Athena 查詢結果中。實現這一目標的一種方法是使用 AWS Glue 工作,這些工作執行擷取、轉換和載入 (ETL) 工作。您可以 AWS Glue 使用 PySpark Python 方言延伸的語言來撰寫指令碼。如需詳細資訊,請參閱AWS Glue 開發人員指南中的使用 AWS Glue 編寫工作

下列範例會示範 AWS Glue 指令碼中的函數,該函式會使用寫出動態影格from_options,並將writeHeader格式選項設定為 false,這會移除標頭資訊:

glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://DOC-EXAMPLE-BUCKET/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")

AWS Glue 分割區索引和篩選

當 Athena 查詢已分割的資料表時,會擷取和篩選可用資料表分割區至與您的查詢相關的子集。隨著新資料和分割區的增加,處理分割區需要更長的時間,執行查詢的時間可能會增加。如果您有一個具有大量分割區的資料表,並且分割區的數量隨著時間的推移而增加,請考慮使用 AWS Glue 分割區索引和篩選。分割區索引允許 Athena 最佳化分割區處理,並改善高度已分割的資料表的查詢效能。在資料表屬性中設定分割區篩選,一共有兩個步驟:

  1. 在 AWS Glue建立分割區索引。

  2. 啟用資料表的分割區篩選。

建立分割區索引

如需在中建立分割區索引的步驟 AWS Glue,請參閱開 AWS Glue 發人員指南中的使用分割區索引。如需中分割區索引的限制 AWS Glue,請參閱該頁面的關於分割區索引一節。

啟用分割區篩選

如需啟用資料表的分割區篩選,您必須在 AWS Glue設定新資料表屬性。如需如何在中設定表格屬性的步驟 AWS Glue,請參閱設定分割區投影頁面。當您在中編輯表格詳細資訊時 AWS Glue,請將下列索引鍵值配對新增至表格特性段落:

  • 對於 Key (索引鍵),新增 partition_filtering.enabled

  • 對於 Value (數值),新增 true

您可以將 partition_filtering.enabled 設定為 false,隨時停用此資料表上的分割區篩選。

完成上述步驟後,您可以返回 Athena 主控台以查詢資料。

如需有關使用分割區索引和篩選的詳細資訊,請參閱AWS 大數據部落格中的使用 AWS Glue Data Catalog 分區索引改善 Amazon Athena 查詢效能

使用地理空間資料

AWS Glue 本身不支援已知文字 (WKT)、已知二進位檔 (WKB) 或其他 PostGIS 資料類型。 AWS Glue 分類器會剖析地理空間資料,並使用格式支援的資料類型 (例如 varchar CSV) 對其進行分類。與其他 AWS Glue 表格一樣,您可能需要更新從空間資料建立的表格的性質,以允許 Athena 依原樣剖析這些資料類型。如需詳細資訊,請參閱 使用 AWS Glue 爬蟲使用 CSV 檔案。Athena 可能無法按原樣剖析 AWS Glue 表格中的某些地理空間資料類型。如需在 Athena 中使用地理空間資料的詳細資訊,請參閱查詢地理空間資料

使用與 AWS Glue Athena 的 ETL 工作

AWS Glue 工作執行 ETL 操作。 AWS Glue 工作會執行從來源擷取資料、轉換資料並將其載入目標的指令集。如需詳細資訊,請參閱AWS Glue 開發人員指南中的使用 AWS Glue 編寫工作

針對 AWS Glue ETL 工作使用 Athena 建立資料表

您在 Athena 中建立的資料表必須新增一個資料表屬性,稱為 classification,它可以識別資料格式。這允許 AWS Glue 使用表進行 ETL 作業。分類值可以是 avrocsvjsonorcparquetxml。Athena 中的 CREATE TABLE 陳述式範例如下所示:

CREATE EXTERNAL TABLE sampleTable ( column1 INT, column2 INT ) STORED AS PARQUET TBLPROPERTIES ( 'classification'='parquet')

如果在建立資料表時未新增 table 屬性,您可以使用 AWS Glue 主控台新增它。

若要使用 AWS Glue 主控台新增分類表屬性

  1. 請登入 AWS Management Console 並開啟 AWS Glue 主控台,網址為 https://console.aws.amazon.com/glue/

  2. 在主控台導覽窗格中,選擇 Tables (資料表)。

  3. 選擇您想要編輯的資料表連結,然後選擇 Action (動作)、Edit table (編輯資料表)。

  4. 向下捲動到 Table properties (資料表屬性) 的區段中。

  5. 選擇新增

  6. Key (索引鍵) 欄位,輸入 classification

  7. Value (值) 欄位,輸入資料類型 (例如,json)。

  8. 選擇儲存

    Table details (資料表詳細資訊) 區段中,您輸入的資料類型會顯示在 Classification (分類) 表格的欄位。

如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的使用資料表

使用 ETL 任務來最佳化查詢效能

AWS Glue 工作可協助您將資料轉換為可最佳化 Athena 查詢效能的格式。資料格式對於 Athena 中的查詢效能和查詢成本有重大影響。

我們建議使用實木複合地板和 ORC 數據格式。 AWS Glue 支援寫入這兩種資料格式,可讓您更輕鬆快速地將資料轉換為 Athena 的最佳格式。如需這些格式的詳細資訊以及其他改善效能的方法,請參閱 Amazon Athena 的十大效能調整秘訣

在轉換為 ORC 時將 SMALLINT 和 TINYINT 資料類型轉換為 INT

為了減少 Athena 無法讀取 ETL 工作所產生之SMALLINTTINYINT資料類型的可能性,請在使用精靈或撰寫 AWS Glue ETL 工作的指令碼INT時轉換SMALLINTTINYINT為。

自動化 ET AWS Glue L 工作

您可以將 AWS Glue ETL 工作設定為根據觸發程序自動執行。當將來自外部 AWS 的資料以不理想的格式推送至 Amazon S3 儲存貯體以便在 Athena 進行查詢時,此功能非常理想。如需詳細資訊,請參閱《AWS Glue 開發人員指南》中的觸發 AWS Glue 任務