选择您的 Cookie 首选项

我们使用必要 Cookie 和类似工具提供我们的网站和服务。我们使用性能 Cookie 收集匿名统计数据,以便我们可以了解客户如何使用我们的网站并进行改进。必要 Cookie 无法停用,但您可以单击“自定义”或“拒绝”来拒绝性能 Cookie。

如果您同意,AWS 和经批准的第三方还将使用 Cookie 提供有用的网站功能、记住您的首选项并显示相关内容,包括相关广告。要接受或拒绝所有非必要 Cookie,请单击“接受”或“拒绝”。要做出更详细的选择,请单击“自定义”。

步骤 2:创建表

聚焦模式
步骤 2:创建表 - Amazon Athena

现在,您有了数据库,可以为其创建一个 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)。您指定的正则表达式组将成为单独的表列。要在您的 CREATE TABLE 语句中使用正则表达式,请使用类似下面的语法。此语法指示 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 语句和正则表达式。

在 Athena 中创建表
  1. 在导航窗格中,对于 Database(数据库),请确保选择了 mydatabase

  2. 要在查询编辑器中扩大空间,您可以选择箭头图标来折叠导航窗格。

    选择箭头可折叠导航窗格。
  3. 要创建新查询的选项卡,请在查询编辑器中选择加号 (+)。您最多可以同时打开十个查询选项卡。

    选择加号图标以创建新查询。
  4. 要关闭一个或多个查询选项卡,请选择加号旁边的箭头。要一次关闭所有选项卡,请选择箭头,然后选择 Close all tabs(关闭所有选项卡)。

    选择箭头图标可关闭一个或多个查询选项卡。
  5. 在查询窗格中,输入以下 CREATE EXTERNAL TABLE 语句。正则表达式将操作系统、浏览器和浏览器版本信息从日志数据中的 ClientInfo 字段划分出来。

    注意

    以下示例中使用的正则表达式旨在处理 athena-examples Amazon S3 位置中公开可用的示例 CloudFront 日志数据,仅供说明。有关同时查询标准和实时 CloudFront 日志文件的最新正则表达式,请参阅 查询 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(表)列表中。

隐私网站条款Cookie 首选项
© 2025, Amazon Web Services, Inc. 或其附属公司。保留所有权利。