步驟 2:建立資料表 - Amazon Athena

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

步驟 2:建立資料表

現在您有一個資料庫,您可以為其建立 Athena 資料表。您建立的資料表將以位置 s3://athena-examples-myregion/cloudfront/plaintext/ 中的 Amazon CloudFront 日誌資料為基準,其中 myregion 是目前 AWS 區域所在位置。

日誌資料範例採用製表符分隔值 (TSV) 格式,這表示製表符字元會用作分隔符號來分隔欄位。資料看起來會如以下範例:出於可讀性考量,摘錄中的製表符已轉換為空格並縮短了最終欄位。

2014-07-05 20:00:09 DFW3 4260 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-1.jpeg 200 - Mozilla/5.0[...] 2014-07-05 20:00:09 DFW3 4252 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-2.jpeg 200 - Mozilla/5.0[...] 2014-07-05 20:00:10 AMS1 4261 10.0.0.15 GET eabcd12345678.cloudfront.net /test-image-3.jpeg 200 - Mozilla/5.0[...]

若要讓 Athena 能讀取此資料,您可以建立簡單直接的 CREATE EXTERNAL TABLE 陳述式 (如以下所示)。建立資料表的陳述式會定義與資料對應的資料欄、指定資料的分隔方式,並指定 Amazon S3 中包含資料範例的位置。請注意,由於 Athena 預期要掃描資料夾中的所有檔案,因此 LOCATION 子句會指定 Amazon S3 資料夾位置,而不是特定檔案。

目前請勿使用此範例,因為它具有一個重要限制,我們會在稍後進行解釋。

CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `Date` DATE, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, ClientInfo STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' LOCATION 's3://athena-examples-my-region/cloudfront/plaintext/';

此範例會建立名為 cloudfront_logs 的資料表,並為每個欄位指定名稱和資料類型。這些欄位會成為資料表中的資料欄。由於 date保留字,它透過反引號 (`) 字符轉義。ROW FORMAT DELIMITED 代表 Athena 將使用名為 LazySimpleSerDe 的預設程式庫來完成解析資料的實際工作。此範例也會指定欄位以製表符分隔 (FIELDS TERMINATED BY '\t'),且檔案中的每個記錄以新行字元(LINES TERMINATED BY '\n) 結尾。最後,LOCATION 子句會指定要讀取的實際資料所在的 Amazon S3 中的路徑。

如果您有自己的製表符或逗號分隔的資料,則可以使用 CREATE TABLE 陳述式,例如剛剛呈現的範例,只要您的欄位不包含巢狀資訊。不過,如果您的資料欄 (例如 ClientInfo) 包含使用不同分隔符號的巢狀資訊,則需要不同的方法。

從 ClientInfo 欄位擷取資料

查看範例資料,以下是最終欄位 ClientInfo 的完整範例:

Mozilla/5.0%20(Android;%20U;%20Windows%20NT%205.1;%20en-US;%20rv:1.9.0.9)%20Gecko/2009040821%20IE/3.0.9

如您所見,此欄位為多重值。由於剛剛呈現的範例 CREATE TABLE 陳述式將製表符指定為欄位分隔符號,則無法將 ClientInfo 欄位內的單獨元件分解為單獨的資料欄。因此,需要新的 CREATE TABLE 陳述式。

若要根據 ClientInfo 欄位內的數值建立資料欄,您可以使用包含 regex 群組的規則表達式 (regex)。您指定的 regex 群組會成為單獨的資料表資料欄。若要在 CREATE TABLE 陳述式中使用 regex,則請使用如下所示的語法。此語法指示 Athena 使用 Regex SerDe 程式庫和您指定的規則表達式。

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ("input.regex" = "regular_expression")

規則表達式對於根據複雜的 CSV 或 TSV 資料建立資料表非常有用,但是很難寫入和維護。幸運的是,還有其他程式庫可用於 JSON、Parquet 和 ORC 等格式。如需詳細資訊,請參閱為您的資料選擇 SerDe

現在您已準備好要開始在 Athena 查詢編輯器中建立資料表。所以該 CREATE TABLE 陳述式和 regex 正好提供給您。

如何在 Athena 中建立資料表
  1. 在導覽窗格中,針對 Database (資料庫),請確認 mydatabase 已選取。

  2. 若要在查詢編輯器中給自己更多空間,您可以選擇箭頭圖示來收合導覽窗格。

    選擇箭頭以收合導覽窗格。
  3. 如需建立新查詢的索引標籤,請選擇加號 (+) 以登入查詢編輯器。一次最多可以開啟十個查詢標籤。

    選擇加號圖示以建立新查詢。
  4. 如需關閉一個或多個查詢索引標籤,請選擇加號旁邊的箭頭。如需一次關閉所有索引標籤,請選擇箭頭,然後選擇 Close all tabs (關閉所有索引標籤)。

    選擇箭頭圖示,便可關閉一個或多個查詢索引標籤。
  5. 在查詢窗格中,輸入下列 CREATE EXTERNAL TABLE 陳述式。Regex 會細分來自日誌資料中 ClientInfo 欄位的作業系統、瀏覽器和瀏覽器版本資訊。

    注意

    下列範例中使用的 regex 旨在與 athena-examples Amazon S3 位置中公開的範例 CloudFront 日誌資料搭配使用,且僅供示範之用。如需有關查詢標準和即時 CloudFront 日誌檔案的最新 regex,請參閱 查詢 Amazon CloudFront 日誌

    CREATE EXTERNAL TABLE IF NOT EXISTS cloudfront_logs ( `Date` DATE, Time STRING, Location STRING, Bytes INT, RequestIP STRING, Method STRING, Host STRING, Uri STRING, Status INT, Referrer STRING, os STRING, Browser STRING, BrowserVersion STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "^(?!#)([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+([^ ]+)\\s+[^\(]+[\(]([^\;]+).*\%20([^\/]+)[\/](.*)$" ) LOCATION 's3://athena-examples-myregion/cloudfront/plaintext/';
  6. LOCATION陳述式中,將 myregion 取代 AWS 區域 為您目前正在使用的 (例如,us-west-1)。

  7. 選擇執行

    系統會建立資料表 cloudfront_logs,且資料表顯示在 mydatabase 資料庫的 Tables (資料表) 清單下。