

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

# 步驟 2：建立資料表
<a name="step-2-create-a-table"></a>

現在您有一個資料庫，您可以為其建立 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` 是[保留字](reserved-words.md#list-of-ddl-reserved-words)，它透過反引號 (`) 字符轉義。`ROW FORMAT DELIMITED` 代表 Athena 將使用名為 [LazySimpleSerDe](lazy-simple-serde.md) 的預設程式庫來完成解析資料的實際工作。此範例也會指定欄位以製表符分隔 (`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 群組的[規則表達式](https://en.wikipedia.org/wiki/Regular_expression) (regex)。您指定的 regex 群組會成為單獨的資料表資料欄。若要在 `CREATE TABLE` 陳述式中使用 regex，則請使用如下所示的語法。此語法指示 Athena 使用 [Regex SerDe](regex-serde.md) 程式庫和您指定的規則表達式。

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

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

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

**如何在 Athena 中建立資料表**

1. 在導覽窗格中，針對 **Database** (資料庫)，請確認 `mydatabase` 已選取。

1. 若要在查詢編輯器中給自己更多空間，您可以選擇箭頭圖示來收合導覽窗格。  
![\[選擇箭頭以收合導覽窗格。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-collapse-nav-pane.png)

1. 如需建立新查詢的索引標籤，請選擇加號 (**\$1**) 以登入查詢編輯器。一次最多可以開啟十個查詢標籤。  
![\[選擇加號圖示以建立新查詢。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/getting-started-new-query-tab.png)

1. 如需關閉一個或多個查詢索引標籤，請選擇加號旁邊的箭頭。如需一次關閉所有索引標籤，請選擇箭頭，然後選擇 **Close all tabs** (關閉所有索引標籤)。  
![\[選擇箭頭圖示，便可關閉一個或多個查詢索引標籤。\]](http://docs.aws.amazon.com/zh_tw/athena/latest/ug/images/close-all-query-editor-tabs.png)

1. 在查詢窗格中，輸入下列 `CREATE EXTERNAL TABLE` 陳述式。Regex 會細分來自日誌資料中 `ClientInfo` 欄位的作業系統、瀏覽器和瀏覽器版本資訊。
**注意**  
下列範例中使用的 regex 旨在與 `athena-examples` Amazon S3 位置中公開的範例 CloudFront 日誌資料搭配使用，且僅供示範之用。如需有關查詢標準和即時 CloudFront 日誌檔案的最新 regex，請參閱 [查詢 Amazon CloudFront 日誌](cloudfront-logs.md)。

   ```
   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/';
   ```

1. 在 `LOCATION`陳述式中，將 *myregion* 取代 AWS 區域 為您目前正在使用的 （例如，`us-west-1`)。

1. 選擇**執行**。

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