1. 创建S3桶

区域选择东京,创建S3桶s3-redshift-dw

2. 准备数据

2.1. 创建策略从其它账号S3桶复制数据

2.1.1. 创建策略AcrossAccountCopyS3
2.1.2. 对dw_user用户添加策略AcrossAccountCopyS3
2.1.3. 创建并下载dw_user的访问密钥
2.1.4. 使用访问密钥从其它账号S3桶中复制测试数据

3. 创建redshift

3.1. 对dw_user用户添加策略

https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2.html

AmazonRedshiftReadOnlyAccess

AmazonRedshiftQueryEditor
AWSKeyManagementServicePowerUser

AmazonRedshiftQueryEditorV2FullAccess

AmazonRedshiftQueryEditorV2ReadSharing

AmazonRedshiftQueryEditorV2NoSharing

AmazonRedshiftQueryEditorV2ReadWriteSharing

3.2. 创建用于redshift的S3只读权限的角色

3.3. 使用控制台创建Redshift

3.3.1. 在Redshift控制台点击右上角区域,选择东京
3.3.2. 创建Redshift

点击集群->创建集群,在新打开的页面中进行如下操作:

  • 输入集群标识符redshift-dw-test01
  • 集群用途选择生产
  • 节点大小选择ra3.4xlarge
  • AQUA (高级查询加速器)默认自动
  • 节点数改成4
  • 不勾选加载示例数据
  • 勾选自动生成密码或输入数据管理员用户密码,此步骤输入的密码_1234Qwer
  • 集群权限选择3.2中创建的RedshiftRole-S3ReadOlny
  • 点击页面下方创建集群,等待集群创建

3.4. 连接Redshift数据库

点击集群->连接到Redshift集群->查询数据,打开Redshift操作页面

3.5. 创建表

将创建表的sql语句粘贴到命令窗口,点击Run,执行sql语句创建表

create table slim_shred (

user_pseudo_id varchar(60),

advertising_id varchar(60),

event_timestamp int8,

event_name varchar(60),

country varchar(20),

version varchar(10),

id varchar(60),

user_first_touch_timestamp int8,

event_params super

);

创建完成后,在public下可以看到表slim_shred

4. 从S3加载数据

4.1. 执行以下命令,从s3加载数据

copy slim_shred from ‘s3://s3-redshift-dw/trans03/part’

iam_role ‘arn:aws:iam::961692981863:role/RedshiftRole-S3ReadOnly’

json ‘auto ignorecase’ MAXERROR 1000;

4.2. 执行过程报错

在执行过程中出现因country字段长度超过20,version字段长度超过10,导致插入数据失败

4.3. 对表结构进行调整

alter table slim_shred ALTER COLUMN country TYPE varchar(50);

alter table slim_shred ALTER COLUMN version TYPE varchar(20);

4.4. 重新执行加载命令

再次执行命令,经过22分钟21秒加载完成

4.5. 执行查询sql

执行以下sql,经过59秒查询出结果,共921条

SELECT

 first_open_date,

 country,

 event_name,

 DATE_DIFF(‘d’,retention_date, first_open_date) AS date_diff,

 COUNT(DISTINCT first_uid) AS users,

 COUNT(first_uid) AS events

FROM ((

 SELECT

 DATE( date_add( ‘h’,-8,date_add(‘us’,event_timestamp,’1970-01-01′))) AS first_open_date,

 country AS country,

 user_pseudo_id AS first_uid

 FROM

 slim_shred

 WHERE

 event_name = ’19d2da1d0d3c1cd08a318cbd5c04a3b0′

— AND _TABLE_SUFFIX BETWEEN ‘20200830’

— AND ‘20200918’

— AND app_info.id = ‘com.root.clean.boost.explorer.filemanager’

 GROUP BY

 first_open_date,

 country,

 first_uid )

 INNER JOIN (

 SELECT

 DATE( date_add( ‘h’,-8,date_add(‘us’,event_timestamp,’1970-01-01′))) AS retention_date,

 event_name,

 user_pseudo_id AS retention_uid

 FROM

 slim_shred

 WHERE

 event_name IN (‘e37b4b622992267149d25437cbb75237’)

— AND _TABLE_SUFFIX BETWEEN ‘20200830’

— AND ‘20200918’

 GROUP BY

 retention_date,

 event_name,

 retention_uid )

 ON

 first_uid = retention_uid)

GROUP BY

 first_open_date,

 country,

 event_name,

 date_diff

HAVING

 date_diff BETWEEN 0

 AND 15

ORDER BY

 first_open_date,

 country,

 date_diff

4.6. 执行重复sql

在新窗口中再次执行上述sql,经过7毫秒,查询出结果