本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
現在您有一個資料庫,您可以為其建立 Athena 資料表。您建立的資料表將以位置 中的範例 Amazon CloudFront 日誌資料為基礎s3://athena-examples-
,其中 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 使用 正則表 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 旨在使用 Amazon S3
athena-examples
位置中公開的範例 CloudFront 日誌資料,且僅供說明之用。如需查詢標準和即時 CloudFront 日誌檔案的更多 up-to-date regexe,請參閱 查詢 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 (資料表) 清單下。