步骤 6:从 Amazon S3 中加载示例数据 - Amazon Redshift

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

步骤 6:从 Amazon S3 中加载示例数据

此时,您拥有了一个名为 dev 的数据库,并且已连接。接下来,在该数据库中创建一些表,将数据上传到表并尝试查询。为方便起见,您上传的示例数据在 Amazon S3 存储桶中可用。

注意

如果您使用的是 SQL 客户端工具,请确保您的 SQL 客户端已连接到集群。

完成此步骤后,您可以在接下来该做什么?中详细了解 Amazon Redshift 并重置环境。

上传示例数据

  1. 创建表。

    如果您使用的是 Amazon Redshift 查询编辑器,请分别复制并运行以下创建表语句,以在 dev 数据库中创建表。有关语法的更多信息,请参阅 https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_TABLE_NEW.html 中的 CREATE TABLEAmazon Redshift Database Developer Guide。

    create table users( userid integer not null distkey sortkey, username char(8), firstname varchar(30), lastname varchar(30), city varchar(30), state char(2), email varchar(100), phone char(14), likesports boolean, liketheatre boolean, likeconcerts boolean, likejazz boolean, likeclassical boolean, likeopera boolean, likerock boolean, likevegas boolean, likebroadway boolean, likemusicals boolean);
    create table venue( venueid smallint not null distkey sortkey, venuename varchar(100), venuecity varchar(30), venuestate char(2), venueseats integer);
    create table category( catid smallint not null distkey sortkey, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
    create table date( dateid smallint not null distkey sortkey, caldate date not null, day character(3) not null, week smallint not null, month character(5) not null, qtr character(5) not null, year smallint not null, holiday boolean default('N'));
    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);
    create table listing( listid integer not null distkey, sellerid integer not null, eventid integer not null, dateid smallint not null sortkey, numtickets smallint not null, priceperticket decimal(8,2), totalprice decimal(8,2), listtime timestamp);
    create table sales( salesid integer not null, listid integer not null distkey, sellerid integer not null, buyerid integer not null, eventid integer not null, dateid smallint not null sortkey, qtysold smallint not null, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp);
  2. 使用 COPY 命令从 Amazon S3 中加载示例数据。

    注意

    我们建议使用 COPY 命令将大型数据集从 Amazon S3 或 DynamoDB 加载到 Amazon Redshift 中。有关 COPY 语法的更多信息,请参阅 https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html 中的 COPYAmazon Redshift Database Developer Guide。

    下载文件 tickitdb.zip,其中包含各个样本数据文件。将各个文件解压缩并将其加载到 AWS 区域中 Amazon S3 存储桶的 tickit 文件夹中。编辑本教程中的 COPY 命令以指向 Amazon S3 存储桶中的文件。有关如何使用 Amazon S3 管理文件的信息,请参阅 中的创建和配置 S3 存储桶。Amazon Simple Storage Service 控制台用户指南

    要加载示例数据,您必须为您的集群提供代表您访问 Amazon S3 的身份验证。您可提供基于角色的身份验证或基于密钥的身份验证。我们建议使用基于角色的身份验证。有关两种类型的身份验证的更多信息,请参阅 https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-credentials.html 中的 CREDENTIALSAmazon Redshift Database Developer Guide。

    在此步骤中,您将通过引用在前面步骤中创建并附加到集群的 IAM 角色来提供身份验证。

    注意

    如果您没有访问 Amazon S3 的适当权限,则在运行 COPY 命令时会收到以下错误消息:S3ServiceException: Access Denied。 有关 COPY 命令的 IAM 权限的信息,请参阅 https://docs.aws.amazon.com/redshift/latest/dg/copy-usage_notes-access-permissions.html 中的 COPYAmazon Redshift Database Developer Guide。

    COPY 命令包含用于 IAM 角色、存储桶名称和 AWS 区域的 Amazon 资源名称 (ARN) 的占位符,如下例所示。

    copy users from 's3://<myBucket>/tickit/allusers_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' region '<aws-region>';

    要使用 IAM 角色授予访问权限,请将 CREDENTIALS 参数字符串中的 <iam-role-arn> 替换为您在步骤 2:创建 IAM 角色中创建的 IAM 角色的角色 ARN。

    您的 COPY 命令类似下面的示例。

    copy users from 's3://<myBucket>/tickit/allusers_pipe.txt' credentials 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole' delimiter '|' region '<aws-region>';

    要加载示例数据,请替换 <myBucket>, <iam-role-arn>, 和 <aws-region> 以下 COPY 命令中的 和您的值。如果您使用的是 Amazon Redshift 查询编辑器,请单独运行以下命令。

    copy users from 's3://<myBucket>/tickit/allusers_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' region '<aws-region>';
    copy venue from 's3://<myBucket>/tickit/venue_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' region '<aws-region>';
    copy category from 's3://<myBucket>/tickit/category_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' region '<aws-region>';
    copy date from 's3://<myBucket>/tickit/date2008_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' region '<aws-region>';
    copy event from 's3://<myBucket>/tickit/allevents_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region '<aws-region>';
    copy listing from 's3://<myBucket>/tickit/listings_pipe.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '|' region '<aws-region>';
    copy sales from 's3://<myBucket>/tickit/sales_tab.txt' credentials 'aws_iam_role=<iam-role-arn>' delimiter '\t' timeformat 'MM/DD/YYYY HH:MI:SS' region '<aws-region>';
  3. 现在,尝试进行示例查询。有关更多信息,请参阅 https://docs.aws.amazon.com/redshift/latest/dg/r_SELECT_synopsis.html 开发人员指南 中的 Amazon RedshiftSELECT

    -- Get definition for the sales table. SELECT * FROM pg_table_def WHERE tablename = 'sales'; -- Find total sales on a given calendar date. SELECT sum(qtysold) FROM sales, date WHERE sales.dateid = date.dateid AND caldate = '2008-01-05'; -- Find top 10 buyers by quantity. SELECT firstname, lastname, total_quantity FROM (SELECT buyerid, sum(qtysold) total_quantity FROM sales GROUP BY buyerid ORDER BY total_quantity desc limit 10) Q, users WHERE Q.buyerid = userid ORDER BY Q.total_quantity desc; -- Find events in the 99.9 percentile in terms of all time gross sales. SELECT eventname, total_price FROM (SELECT eventid, total_price, ntile(1000) over(order by total_price desc) as percentile FROM (SELECT eventid, sum(pricepaid) total_price FROM sales GROUP BY eventid)) Q, event E WHERE Q.eventid = E.eventid AND percentile = 1 ORDER BY total_price desc;