

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# Amazon Redshift Spectrum 入门
<a name="c-getting-started-using-spectrum"></a>

在本教程中，您将了解如何使用 Amazon Redshift Spectrum 直接从 Amazon S3 上的文件中查询数据。如果您已经有一个集群和一个 SQL 客户端，您通过极少的设置即可完成本教程。

**注意**  
Redshift Spectrum 查询将产生额外的费用。本教程中运行示例查询的费用极低。有关定价的更多信息，请参阅 [Amazon Redshift Spectrum 定价](https://aws.amazon.com/redshift/pricing/#redshift-spectrum-pricing)。

## 先决条件
<a name="c-getting-started-using-spectrum-prerequisites"></a>

要使用 Redshift Spectrum，您需要一个 Amazon Redshift 集群和一个连接到集群的 SQL 客户端，供您运行 SQL 命令。该集群和 Amazon S3 中的数据文件必须位于同一 AWS 区域中。

有关如何创建 Amazon Redshift 集群的信息，请参阅《Amazon Redshift 入门指南》**中的 [Amazon Redshift 预置数据仓库入门](https://docs.aws.amazon.com/redshift/latest/gsg/new-user.html)。有关连接到集群的方法的信息，请参阅《Amazon Redshift 入门指南》**中的[连接到 Amazon Redshift 数据仓库](https://docs.aws.amazon.com/redshift/latest/gsg/database-tasks.html)。

在下面的一些示例中，示例数据位于美国东部（弗吉尼亚州北部）(`us-east-1`)，因此您需要一个也位于 `us-east-1` 的集群。或者，您可以使用 Amazon S3 将以下桶和文件夹中的数据对象复制到集群所在的 AWS 区域的桶中：
+ `s3://redshift-downloads/tickit/spectrum/customers/*`
+ `s3://redshift-downloads/tickit/spectrum/sales_partition/*`
+ `s3://redshift-downloads/tickit/spectrum/sales/*`
+ `s3://redshift-downloads/tickit/spectrum/salesevent/*`

运行类似于以下内容的 Amazon S3 命令，将位于美国东部（弗吉尼亚州北部）的示例数据复制到您的 AWS 区域。在运行命令之前，请创建桶并在此桶中创建文件夹，以匹配您的 Amazon S3 copy 命令。Amazon S3 copy 命令的输出确认文件已复制到所需 AWS 区域中的 *bucket-name*。

```
aws s3 cp s3://redshift-downloads/tickit/spectrum/ s3://bucket-name/tickit/spectrum/ --copy-props none --recursive
```

## 使用 AWS CloudFormation 的 Redshift Spectrum 入门
<a name="c-getting-started-using-spectrum-cfn"></a>

作为以下步骤的替代方法，您可以访问 Redshift Spectrum DataLake AWS CloudFormation 模板，以创建一个包含您可查询的 Amazon S3 桶的堆栈。有关更多信息，请参阅 [启动您的 AWS CloudFormation 堆栈，然后在 Amazon S3 中查询您的数据](#c-getting-started-using-spectrum-query-s3-data-cfn)。

## Redshift Spectrum 入门分步指南
<a name="c-getting-started-using-spectrum-steps"></a>

要开始使用 Amazon Redshift Spectrum，请执行以下步骤：
+ [第 1 步 为 Amazon Redshift 创建一个 IAM 角色](#c-getting-started-using-spectrum-create-role) 
+ [步骤 2：将 IAM 角色与集群相关联](#c-getting-started-using-spectrum-add-role) 
+ [步骤 3：创建外部架构和外部表](#c-getting-started-using-spectrum-create-external-table) 
+ [步骤 4：在 Amazon S3 中查询数据](#c-getting-started-using-spectrum-query-s3-data) 

## 第 1 步 为 Amazon Redshift 创建一个 IAM 角色
<a name="c-getting-started-using-spectrum-create-role"></a>

您的集群需要授权才能访问您在 AWS Glue 或 Amazon Athena 中的外部数据目录以及您在 Amazon S3 中的数据文件。要提供授权，您需要引用附加到集群的 AWS Identity and Access Management (IAM) 角色。有关将角色用于 Amazon Redshift 的更多信息，请参阅[使用 IAM 角色授权 COPY 和 UNLOAD 操作](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)。

**注意**  
在某些情况下，您可以将 Athena Data Catalog 迁移到 AWS Glue Data Catalog。如果您的集群在支持 AWS Glue 的 AWS 区域内，并且您在 Athena Data Catalog 中拥有 Redshift Spectrum 外部表，则可执行此操作。要将 AWS Glue 数据目录用于 Redshift Spectrum，您可能需要更改您的 IAM 策略。有关更多信息，请参阅《Athena 用户指南》**中的[升级到 AWS Glue Data Catalog](https://docs.aws.amazon.com/athena/latest/ug/glue-athena.html#glue-upgrade)。

为 Amazon Redshift 创建角色时，请选择以下方法之一：
+ 如果您将 Redshift Spectrum 与 Athena Data Catalog 或 AWS Glue Data Catalog 结合使用，请按照 [要为 Amazon Redshift 创建一个 IAM 角色](#spectrum-get-started-create-role) 中概述的步骤操作。
+ 如果您将 Redshift Spectrum 与为 AWS Lake Formation 启用的 AWS Glue Data Catalog 结合使用，请按照以下程序中概括的步骤操作：
  +  [要使用为 AWS Lake Formation 启用的 AWS Glue Data Catalog 为 Amazon Redshift 创建 IAM 角色](#spectrum-get-started-create-role-lake-formation) 
  +  [授予对表的 SELECT 权限以在 Lake Formation 数据库中进行查询](#spectrum-get-started-grant-lake-formation-table) <a name="spectrum-get-started-create-role"></a>

**要为 Amazon Redshift 创建一个 IAM 角色**

1. 打开 [IAM 控制台](https://console.aws.amazon.com/iam/home?#home)。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 选择 **AWS 服务**作为可信实体，然后选择 **Redshift** 作为使用案例。

1. 在**其他 AWS 服务的使用案例**下，选择 **Redshift - 可自定义**，然后选择**下一步**。

1. 此时显示**添加权限策略**页面。选择 `AmazonS3ReadOnlyAccess` 和 `AWSGlueConsoleFullAccess`（如果使用的是 AWS Glue 数据目录）。或选择 `AmazonAthenaFullAccess`（如果使用的是 Athena Data Catalog）。选择**下一步**。
**注意**  
`AmazonS3ReadOnlyAccess` 策略为您的集群提供对所有 Amazon S3 桶的只读访问。要仅授予 AWS 示例数据桶的访问权限，请创建新策略并添加以下权限。  

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:Get*",
                   "s3:List*"
               ],
               "Resource": "arn:aws:s3:::redshift-downloads/*"
           }
       ]
   }
   ```

1. 对于**角色名称**，输入您角色的名称，例如 **myspectrum\$1role**。

1. 检查信息，然后选择 **Create role**。

1. 在导航窗格中，选择**角色**。选择新角色的名称以查看摘要，然后将 **Role ARN** 复制到剪贴板。该值是您刚创建的角色的 Amazon 资源名称 (ARN)。您将在创建用于引用 Amazon S3 上的数据文件的外部表时使用此值。<a name="spectrum-get-started-create-role-lake-formation"></a>

**要使用为 AWS Lake Formation 启用的 AWS Glue Data Catalog 为 Amazon Redshift 创建 IAM 角色**

1. 通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**策略**。

   如果这是您首次选择 **Policies**，则会显示 **Welcome to Managed Policies** 页面。选择**开始使用**。

1. 选择**创建策略**。

1. 选择以在 **JSON** 选项卡上创建策略。

1. 粘贴在以下 JSON 策略文档中，该策略授予对 Data Catalog 的访问权限，但拒绝对 Lake Formation 的管理员权限。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "RedshiftPolicyForLF",
               "Effect": "Allow",
               "Action": [
                   "glue:*",
                   "lakeformation:GetDataAccess"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 完成后，选择**审核**对策略进行审核。策略验证程序将报告任何语法错误。

1. 在**查看策略**页面上，为**名称**输入 **myspectrum\$1policy**，以命名您正在创建的策略。输入**描述**（可选）。查看策略**摘要**以查看您的策略授予的权限。然后，选择**创建策略**以保存您的工作。

   在创建策略之后，您可以向您的用户提供访问权限。

要提供访问权限，请为您的用户、组或角色添加权限：
+ AWS IAM Identity Center 中的用户和群组：

  创建权限集合。按照《AWS IAM Identity Center 用户指南》**中[创建权限集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)的说明进行操作。
+ 通过身份提供者在 IAM 中托管的用户：

  创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供者创建角色（联合身份验证）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
+ IAM 用户：
  + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
  + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》**中[向用户添加权限（控制台）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。<a name="spectrum-get-started-grant-lake-formation-table"></a>

**授予对表的 SELECT 权限以在 Lake Formation 数据库中进行查询**

1. 通过 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 中打开 Lake Formation 控制台。

1. 在导航窗格中，选择**数据湖权限**，然后选择**授予**。

1. 按照《AWS Lake Formation 开发人员指南》**的[使用命名资源方法授予表权限](https://docs.aws.amazon.com/lake-formation/latest/dg/granting-table-permissions.html)中的说明进行操作。提供以下信息：
   + 对于 **IAM 角色**，选择您创建的 IAM 角色 `myspectrum_role`。运行 Amazon Redshift 查询编辑器时，它使用此 IAM 角色来获取数据权限。
**注意**  
要授予对启用了 Lake Formation 的 Data Catalog 中的表的 SELECT 权限以进行查询，请执行以下操作：  
在 Lake Formation 中注册数据的路径。
在 Lake Formation 中授予用户对该路径的权限。
创建的表可在 Lake Formation 中注册的路径中找到。

1. 选择**授权**。

**重要**  
作为最佳实践，仅允许通过 Lake Formation 权限访问底层 Amazon S3 对象。要防止未经批准的访问，请删除授予针对 Lake Formation 以外的 Amazon S3 对象的任何权限。如果您在设置 Lake Formation 之前曾访问了 Amazon S3 对象，请删除之前设置的任何 IAM 策略或桶权限。有关更多信息，请参阅[将 AWS Glue 数据权限升级到 AWS Lake Formation 模型](https://docs.aws.amazon.com/lake-formation/latest/dg/upgrade-glue-lake-formation.html)和 [Lake Formation 权限](https://docs.aws.amazon.com/lake-formation/latest/dg/lake-formation-permissions.html)。

## 步骤 2：将 IAM 角色与集群相关联
<a name="c-getting-started-using-spectrum-add-role"></a>

现在，您已拥有一个 IAM 角色，该角色授权 Amazon Redshift 为您访问外部 Data Catalog 和 Amazon S3。此时，您必须将该角色与您的 Amazon Redshift 集群关联。

**将 IAM 角色与集群关联**

1. 登录到 AWS 管理控制台并打开 Amazon Redshift 控制台，网址：[https://console.aws.amazon.com/redshiftv2/](https://console.aws.amazon.com/redshiftv2/)。

1. 在导航菜单上，选择**集群**，然后选择要更新的集群的名称。

1. 对于**操作**，请选择**管理 IAM 角色**。这将显示**IAM 角色**页面。

1. 选择**输入 ARN**，然后输入 ARN 或 IAM 角色，或从列表中选择 IAM 角色。然后，选择**添加 IAM 角色**以将该角色添加到**已附加的 IAM 角色**列表中。

1. 选择**完成**将 IAM 角色与集群关联。将修改集群以完成更改。

## 步骤 3：创建外部架构和外部表
<a name="c-getting-started-using-spectrum-create-external-table"></a>

在外部 schema 中创建外部表。外部 schema 引用了外部数据目录中的数据库并提供了 IAM 角色 ARN（代表您授权您的集群访问 Amazon S3）。您可在 Amazon Athena Data Catalog、AWS Glue Data Catalog 或 Apache Hive 元存储（如 Amazon EMR）中创建外部数据库。在此示例中，您将在创建外部 schema Amazon Redshift 时在 Amazon Athena Data Catalog 中创建外部数据库。有关更多信息，请参阅 [Amazon Redshift Spectrum 中的外部架构](c-spectrum-external-schemas.md)。<a name="spectrum-get-started-create-external-table"></a>

**创建外部 schema 和外部表**

1. 要创建外部架构，请将以下命令中的 IAM 角色 ARN 替换为您在[步骤 1](#c-getting-started-using-spectrum-create-role) 中创建的角色 ARN。然后在 SQL 客户端中运行该命令。

   ```
   create external schema myspectrum_schema 
   from data catalog 
   database 'myspectrum_db' 
   iam_role 'arn:aws:iam::123456789012:role/myspectrum_role'
   create external database if not exists;
   ```

1. 要创建外部表，请运行以下 CREATE EXTERNAL TABLE 命令。
**注意**  
您的集群和 Amazon S3 桶必须位于同一个 AWS 区域中。对于此示例 CREATE EXTERNAL TABLE 命令，包含示例数据的 Amazon S3 桶位于美国东部（弗吉尼亚州北部）AWS 区域中。要查看源数据，请下载 [`sales_ts.000` 文件](https://s3.amazonaws.com/redshift-downloads/tickit/spectrum/sales/sales_ts.000)。  
您可以修改此示例以在不同的 AWS 区域中运行。在您所需的 AWS 区域中创建 Amazon S3 桶。使用 Amazon S3 copy 命令复制销售数据。然后，将示例 `CREATE EXTERNAL TABLE` 命令中的 location 选项更新到您的桶。  

   ```
   aws s3 cp s3://redshift-downloads/tickit/spectrum/sales/ s3://bucket-name/tickit/spectrum/sales/ --copy-props none --recursive
   ```
Amazon S3 copy 命令的输出确认文件已复制到所需 AWS 区域中的 *bucket-name*。  

   ```
   copy: s3://redshift-downloads/tickit/spectrum/sales/sales_ts.000 to s3://bucket-name/tickit/spectrum/sales/sales_ts.000
   ```

   ```
   create external table myspectrum_schema.sales(
   salesid integer,
   listid integer,
   sellerid integer,
   buyerid integer,
   eventid integer,
   dateid smallint,
   qtysold smallint,
   pricepaid decimal(8,2),
   commission decimal(8,2),
   saletime timestamp)
   row format delimited
   fields terminated by '\t'
   stored as textfile
   location 's3://redshift-downloads/tickit/spectrum/sales/'
   table properties ('numRows'='172000');
   ```

## 步骤 4：在 Amazon S3 中查询数据
<a name="c-getting-started-using-spectrum-query-s3-data"></a>

在创建外部表之后，您可使用用于查询其他 Amazon Redshift 表的同一 SELECT 语句查询外部表。这些 SELECT 语句查询包括联接表、聚合数据和筛选谓词。<a name="spectrum-get-started-query-s3-data"></a>

**要在 Amazon S3 中查询数据**

1. 获取 MYSPECTRUM\$1SCHEMA.SALES 表中的行数。

   ```
   select count(*) from myspectrum_schema.sales;
   ```

   ```
   count 
   ------
   172462
   ```

1. 作为最佳实践，将较大的事实数据表保存在 Amazon S3 中并将较小的维度表保存在 Amazon Redshift 中。如果您已加载了[加载数据](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html)中的示例数据，您的数据库中将有一个名为 EVENT 的表。如果没有，请使用以下命令创建 EVENT 表。

   ```
   create table event(
   eventid integer not null distkey,
   venueid smallint not null,
   catid smallint not null,
   dateid smallint not null sortkey,
   eventname varchar(200),
   starttime timestamp);
   ```

1. 通过将以下 COPY 命令中的 IAM 角色 ARN 替换为[第 1 步 为 Amazon Redshift 创建一个 IAM 角色](#c-getting-started-using-spectrum-create-role)中创建的角色 ARN 来加载 EVENT 表。您可以选择从 AWS 区域 `us-east-1` 中的 Amazon S3 桶下载并查看 [`allevents_pipe.txt` 的源数据](https://s3.amazonaws.com/redshift-downloads/tickit/allevents_pipe.txt)。

   ```
   copy event from 's3://redshift-downloads/tickit/allevents_pipe.txt' 
   iam_role 'arn:aws:iam::123456789012:role/myspectrum_role'
   delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region 'us-east-1';
   ```

   以下示例将外部 Amazon S3 表 MYSPECTRUM\$1SCHEMA.SALES 与本地 Amazon Redshift 表 EVENT 联接，以查找排名前十位的活动的销量总额。

   ```
   select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event
   where myspectrum_schema.sales.eventid = event.eventid
   and myspectrum_schema.sales.pricepaid > 30
   group by myspectrum_schema.sales.eventid
   order by 2 desc;
   ```

   ```
   eventid | sum     
   --------+---------
       289 | 51846.00
      7895 | 51049.00
      1602 | 50301.00
       851 | 49956.00
      7315 | 49823.00
      6471 | 47997.00
      2118 | 47863.00
       984 | 46780.00
      7851 | 46661.00
      5638 | 46280.00
   ```

1. 查看上一查询的查询计划。注意针对 Amazon S3 上的数据执行的 `S3 Seq Scan`、`S3 HashAggregate` 和 `S3 Query Scan` 步骤。

   ```
   explain
   select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) 
   from myspectrum_schema.sales, event
   where myspectrum_schema.sales.eventid = event.eventid
   and myspectrum_schema.sales.pricepaid > 30
   group by myspectrum_schema.sales.eventid
   order by 2 desc;
   ```

   ```
   QUERY PLAN                                                                                                                                                                                
   -----------------------------------------------------------------------------
   XN Limit  (cost=1001055770628.63..1001055770628.65 rows=10 width=31)                                                                                                                      
     ->  XN Merge  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                               
           Merge Key: sum(sales.derived_col2)                                                                                                                                                
           ->  XN Network  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                       
                 Send to leader                                                                                                                                                              
                 ->  XN Sort  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                    
                       Sort Key: sum(sales.derived_col2)                                                                                                                                     
                       ->  XN HashAggregate  (cost=1055770620.49..1055770620.99 rows=200 width=31)                                                                                           
                             ->  XN Hash Join DS_BCAST_INNER  (cost=3119.97..1055769620.49 rows=200000 width=31)                                                                             
                                   Hash Cond: ("outer".derived_col1 = "inner".eventid)                                                                                                       
                                   ->  XN S3 Query Scan sales  (cost=3010.00..5010.50 rows=200000 width=31)                                                                                  
                                         ->  S3 HashAggregate  (cost=3010.00..3010.50 rows=200000 width=16)                                                                                  
                                               ->  S3 Seq Scan myspectrum_schema.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT  (cost=0.00..2150.00 rows=172000 width=16)
                                                     Filter: (pricepaid > 30.00)                                                                                                             
                                   ->  XN Hash  (cost=87.98..87.98 rows=8798 width=4)                                                                                                        
                                         ->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=4)
   ```

## 启动您的 AWS CloudFormation 堆栈，然后在 Amazon S3 中查询您的数据
<a name="c-getting-started-using-spectrum-query-s3-data-cfn"></a>

创建 Amazon Redshift 集群并连接到集群后，您可以安装 Redshift Spectrum DataLake AWS CloudFormation 模板，然后查询您的数据。

CloudFormation 安装 Redshift Spectrum Getting Started DataLake 模板，并创建一个包含以下信息的堆栈：
+ 与 Redshift 集群关联的角色 `myspectrum_role`
+ 外部架构 `myspectrum_schema`
+ Amazon S3 桶中的外部表 `sales`
+ 已加载数据的 Redshift 表 `event`

**启动您的 Redshift Spectrum Getting Started DataLake CloudFormation 堆栈：**

1. 选择[https://console.aws.amazon.com/cloudformation/home?#/stacks/new?stackName=DataLake&templateURL=https://s3.amazonaws.com/redshift-downloads/docs-downloads/DataLake.yml](https://console.aws.amazon.com/cloudformation/home?#/stacks/new?stackName=DataLake&templateURL=https://s3.amazonaws.com/redshift-downloads/docs-downloads/DataLake.yml)。CloudFormation 控制台打开并选定 DataLake.yml 模板。

   您还可以下载和自定义 Redshift Spectrum Getting Started DataLake CloudFormation [CFN 模板](https://s3.amazonaws.com/redshift-downloads/docs-downloads/DataLake.yml)，然后打开 CloudFormation 控制台 ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/))，并使用自定义模板创建堆栈。

1. 选择**下一步**。

1. 在**参数**下，输入 Amazon Redshift 集群名称、数据库名称和您的数据库用户名。

1. 选择**下一步**。

   此时将显示堆栈选项。

1. 选择**下一步**以接受原定设置。

1. 检查信息，然后在**功能**下选择**我确认 AWS CloudFormation 可能会创建 IAM 资源**。

1. 选择**创建堆栈**。

如果在创建堆栈时发生错误，请参阅以下信息：
+ 查看 CloudFormation **事件**选项卡，以获取可以帮助解决错误的信息。
+ 删除 DataLake CloudFormation 堆栈后再重试操作。
+ 确保您已连接到 Amazon Redshift 数据库。
+ 确保您输入了 Amazon Redshift 集群名称、数据库名称和数据库用户名的正确信息。

### 在 Amazon S3 中查询数据
<a name="c-getting-started-spectrum-cfn-query-s3-data"></a>

使用用于查询其它 Amazon Redshift 表的同一 SELECT 语句查询外部表。这些 SELECT 语句查询包括联接表、聚合数据和筛选谓词。

以下查询会返回 `myspectrum_schema.sales` 外部表中的行数。

```
select count(*) from myspectrum_schema.sales;
```

```
count 
------
172462
```

### 将外部表与本地表联接
<a name="c-getting-started-spectrum-cfn-table-join"></a>

以下示例将外部表 `myspectrum_schema.sales` 与本地表 `event` 联接以查找排名前十的活动的销量总额。

```
select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event
where myspectrum_schema.sales.eventid = event.eventid
and myspectrum_schema.sales.pricepaid > 30
group by myspectrum_schema.sales.eventid
order by 2 desc;
```

```
eventid | sum     
--------+---------
    289 | 51846.00
   7895 | 51049.00
   1602 | 50301.00
    851 | 49956.00
   7315 | 49823.00
   6471 | 47997.00
   2118 | 47863.00
    984 | 46780.00
   7851 | 46661.00
   5638 | 46280.00
```

### 查看查询计划
<a name="c-getting-started-spectrum-cfn-query-plan"></a>

查看上一查询的查询计划。注意针对 Amazon S3 上的数据执行的 `S3 Seq Scan`、`S3 HashAggregate` 和 `S3 Query Scan` 步骤。

```
explain
select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) 
from myspectrum_schema.sales, event
where myspectrum_schema.sales.eventid = event.eventid
and myspectrum_schema.sales.pricepaid > 30
group by myspectrum_schema.sales.eventid
order by 2 desc;
```

```
QUERY PLAN                                                                                                                                                                                
-----------------------------------------------------------------------------
XN Limit  (cost=1001055770628.63..1001055770628.65 rows=10 width=31)                                                                                                                      
  ->  XN Merge  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                               
        Merge Key: sum(sales.derived_col2)                                                                                                                                                
        ->  XN Network  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                       
              Send to leader                                                                                                                                                              
              ->  XN Sort  (cost=1001055770628.63..1001055770629.13 rows=200 width=31)                                                                                                    
                    Sort Key: sum(sales.derived_col2)                                                                                                                                     
                    ->  XN HashAggregate  (cost=1055770620.49..1055770620.99 rows=200 width=31)                                                                                           
                          ->  XN Hash Join DS_BCAST_INNER  (cost=3119.97..1055769620.49 rows=200000 width=31)                                                                             
                                Hash Cond: ("outer".derived_col1 = "inner".eventid)                                                                                                       
                                ->  XN S3 Query Scan sales  (cost=3010.00..5010.50 rows=200000 width=31)                                                                                  
                                      ->  S3 HashAggregate  (cost=3010.00..3010.50 rows=200000 width=16)                                                                                  
                                            ->  S3 Seq Scan spectrum.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT  (cost=0.00..2150.00 rows=172000 width=16)
                                                  Filter: (pricepaid > 30.00)                                                                                                             
                                ->  XN Hash  (cost=87.98..87.98 rows=8798 width=4)                                                                                                        
                                      ->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=4)
```