

# 步骤 2：创建表


现在，您有了数据库，可以为其创建一个 Athena 表。您创建的表将基于位置 `s3://athena-examples-myregion/cloudfront/plaintext/` 中的示例 Amazon CloudFront 日志数据，其中 *myregion* 是您当前的 Amazon Web Services 区域。

示例日志数据采用制表符分隔值(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` 字段内的值创建列，可以使用包含正则表达式组的[正则表达式](https://en.wikipedia.org/wiki/Regular_expression)（regex）。您指定的正则表达式组将成为单独的表列。要在您的 `CREATE TABLE` 语句中使用正则表达式，请使用类似下面的语法。此语法指示 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` 语句和正则表达式。

**在 Athena 中创建表**

1. 在导航窗格中，对于 **Database**（数据库），请确保选择了 `mydatabase`。

1. 要在查询编辑器中扩大空间，您可以选择箭头图标来折叠导航窗格。  
![\[选择箭头可折叠导航窗格。\]](http://docs.amazonaws.cn/athena/latest/ug/images/getting-started-collapse-nav-pane.png)

1. 要创建新查询的选项卡，请在查询编辑器中选择加号 (**\$1**)。您最多可以同时打开十个查询选项卡。  
![\[选择加号图标以创建新查询。\]](http://docs.amazonaws.cn/athena/latest/ug/images/getting-started-new-query-tab.png)

1. 要关闭一个或多个查询选项卡，请选择加号旁边的箭头。要一次关闭所有选项卡，请选择箭头，然后选择 **Close all tabs**（关闭所有选项卡）。  
![\[选择箭头图标可关闭一个或多个查询选项卡。\]](http://docs.amazonaws.cn/athena/latest/ug/images/close-all-query-editor-tabs.png)

1. 在查询窗格中，输入以下 `CREATE EXTERNAL TABLE` 语句。正则表达式将操作系统、浏览器和浏览器版本信息从日志数据中的 `ClientInfo` 字段划分出来。
**注意**  
以下示例中使用的正则表达式旨在处理 `athena-examples` Amazon S3 位置中公开可用的示例 CloudFront 日志数据，仅供说明。有关同时查询标准和实时 CloudFront 日志文件的最新正则表达式，请参阅 [查询 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* 替换为您当前使用的 Amazon Web Services 区域（例如，`us-west-1`）。

1. 选择**运行**。

   表 `cloudfront_logs` 已创建，并显示在 `mydatabase` 数据库的 **Tables**(表)列表中。