本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
步驟 2:建立資料表
現在您有一個資料庫,您可以為其建立 Athena 資料表。您建立的資料表將以位置 s3://athena-examples- 中的 Amazon CloudFront 日誌資料為基準,其中 myregion/cloudfront/plaintext/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 群組的規則表達式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 中建立資料表
-
在導覽窗格中,針對 Database (資料庫),請確認
mydatabase已選取。 -
若要在查詢編輯器中給自己更多空間,您可以選擇箭頭圖示來收合導覽窗格。
-
如需建立新查詢的索引標籤,請選擇加號 (+) 以登入查詢編輯器。一次最多可以開啟十個查詢標籤。
-
如需關閉一個或多個查詢索引標籤,請選擇加號旁邊的箭頭。如需一次關閉所有索引標籤,請選擇箭頭,然後選擇 Close all tabs (關閉所有索引標籤)。
-
在查詢窗格中,輸入下列
CREATE EXTERNAL TABLE陳述式。Regex 會細分來自日誌資料中ClientInfo欄位的作業系統、瀏覽器和瀏覽器版本資訊。注意
下列範例中使用的 regex 旨在與
athena-examplesAmazon 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/'; -
在
LOCATION陳述式中,將myregion取代 AWS 區域 為您目前正在使用的 (例如,us-west-1)。 -
選擇執行。
系統會建立資料表
cloudfront_logs,且資料表顯示在mydatabase資料庫的 Tables (資料表) 清單下。