我们将使用以下CloudFormation来创建必须的资源:
https://pingfan.s3.amazonaws.com/files/immersionserverless.yaml
在CloudFormation中创建一个Stack,使用上面的URL:
所有选项保持默认:
点击创建,可能要等20-30min创建完成。
在Redshift服务中,打开Query Editor V2
,然后连接到Serverless:workgroup-xxx
集群。密码是
User Name: awsuser
Password: Awsuser123
连接成功后执行以下命令查询用户列表:
select * from pg_user;
能成功返回结果:
Redshift 是符合 ANSI SQL 的数据仓库。 我们可以使用熟悉的 CREATE TABLE
语句创建表。
我们从 TPC Benchmark
数据模型创建 8 个表,请复制以下创建表语句并运行它们。 下面给出的是表格的数据模型。
在Query Editor
中创建表:
DROP TABLE IF EXISTS partsupp;
DROP TABLE IF EXISTS lineitem;
DROP TABLE IF EXISTS supplier;
DROP TABLE IF EXISTS part;
DROP TABLE IF EXISTS orders;
DROP TABLE IF EXISTS customer;
DROP TABLE IF EXISTS nation;
DROP TABLE IF EXISTS region;
CREATE TABLE region (
R_REGIONKEY bigint NOT NULL,
R_NAME varchar(25),
R_COMMENT varchar(152))
diststyle all;
CREATE TABLE nation (
N_NATIONKEY bigint NOT NULL,
N_NAME varchar(25),
N_REGIONKEY bigint,
N_COMMENT varchar(152))
diststyle all;
create table customer (
C_CUSTKEY bigint NOT NULL,
C_NAME varchar(25),
C_ADDRESS varchar(40),
C_NATIONKEY bigint,
C_PHONE varchar(15),
C_ACCTBAL decimal(18,4),
C_MKTSEGMENT varchar(10),
C_COMMENT varchar(117))
diststyle all;
create table orders (
O_ORDERKEY bigint NOT NULL,
O_CUSTKEY bigint,
O_ORDERSTATUS varchar(1),
O_TOTALPRICE decimal(18,4),
O_ORDERDATE Date,
O_ORDERPRIORITY varchar(15),
O_CLERK varchar(15),
O_SHIPPRIORITY Integer,
O_COMMENT varchar(79))
distkey (O_ORDERKEY)
sortkey (O_ORDERDATE);
create table part (
P_PARTKEY bigint NOT NULL,
P_NAME varchar(55),
P_MFGR varchar(25),
P_BRAND varchar(10),
P_TYPE varchar(25),
P_SIZE integer,
P_CONTAINER varchar(10),
P_RETAILPRICE decimal(18,4),
P_COMMENT varchar(23))
diststyle all;
create table supplier (
S_SUPPKEY bigint NOT NULL,
S_NAME varchar(25),
S_ADDRESS varchar(40),
S_NATIONKEY bigint,
S_PHONE varchar(15),
S_ACCTBAL decimal(18,4),
S_COMMENT varchar(101))
diststyle all;
create table lineitem (
L_ORDERKEY bigint NOT NULL,
L_PARTKEY bigint,
L_SUPPKEY bigint,
L_LINENUMBER integer NOT NULL,
L_QUANTITY decimal(18,4),
L_EXTENDEDPRICE decimal(18,4),
L_DISCOUNT decimal(18,4),
L_TAX decimal(18,4),
L_RETURNFLAG varchar(1),
L_LINESTATUS varchar(1),
L_SHIPDATE date,
L_COMMITDATE date,
L_RECEIPTDATE date,
L_SHIPINSTRUCT varchar(25),
L_SHIPMODE varchar(10),
L_COMMENT varchar(44))
distkey (L_ORDERKEY)
sortkey (L_RECEIPTDATE);
create table partsupp (
PS_PARTKEY bigint NOT NULL,
PS_SUPPKEY bigint NOT NULL,
PS_AVAILQTY integer,
PS_SUPPLYCOST decimal(18,4),
PS_COMMENT varchar(199))
diststyle even;
从S3中加载数据到表中,COPY 命令可以有效地将大量数据从S3 加载到Redshift 中。 单个 COPY 命令可以将多个文件加载到一个表中,它会自动从提供的 S3 路径中并行加载数据。
如果目标表为空,COPY 命令可以根据列数据类型自动对每一列进行压缩编码,这样就不必担心为每一列选择正确的压缩算法。 为了确保 Redshift 执行压缩分析,我们将在 COPY 命令中将 COMPUPDATE 参数设置为 PRESET。
要将数据加载到从TPC Benchmark
数据模型创建的 8 个表中,执行以下COPY命令:
COPY region FROM 's3://redshift-immersionday-labs/data/region/region.tbl.lzo'
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
COPY nation FROM 's3://redshift-immersionday-labs/data/nation/nation.tbl.'
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
copy customer from 's3://redshift-immersionday-labs/data/customer/customer.tbl.'
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
copy orders from 's3://redshift-immersionday-labs/data/orders/orders.tbl.'
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
copy part from 's3://redshift-immersionday-labs/data/part/part.tbl.'
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
copy supplier from 's3://redshift-immersionday-labs/data/supplier/supplier.json' manifest
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
copy lineitem from 's3://redshift-immersionday-labs/data/lineitem-part/'
iam_role default
region 'us-west-2' gzip delimiter '|' COMPUPDATE PRESET;
copy partsupp from 's3://redshift-immersionday-labs/data/partsupp/partsupp.tbl.'
iam_role default
region 'us-west-2' lzop delimiter '|' COMPUPDATE PRESET;
COMPUPDATE PRESET
将使用与列的数据类型相关的Redshift 最佳实践来分配压缩算法,但不分析表中的数据。region.tbl.lzo
),而其他表的 COPY 则指向多个文件的前缀 (lineitem.tbl.
)。supplier.json
)。 清单文件是一个 JSON 文件,其中列出了要加载的文件及其位置。加载数据的预估时间:
让我们检查几个表的数据条数,以确保数据按预期加载:
select count(*) from region; -- 5
select count(*) from nation; -- 25
select count(*) from orders; -- 76000000
要解决数据加载问题,可以查询 SYS_LOAD_ERROR_DETAIL
表。
此外,我们可以验证数据而无需实际加载表,将 NOLOAD
选项与 COPY 命令一起使用,以确保在运行实际数据加载之前先进行检验。
请注意,使用 NOLOAD 选项运行 COPY 比加载数据快得多,因为它只解析文件。
让我们尝试使用具有不匹配列的数据文件加载到CUSTOMER 表:
COPY customer FROM 's3://redshift-immersionday-labs/data/nation/nation.tbl.'
iam_role default
region 'us-west-2' lzop delimiter '|' noload;
会提示报错ERROR: Load into table ‘customer’ failed. Check ‘sys_load_error_detail’ system table for details. :
检查STL_LOAD_ERROR
表:
select * from SYS_LOAD_ERROR_DETAIL;
看到数据类型为 int 的 c_nationkey
列中有一行带有错误消息"Invalid digit, Value 'h', Pos 1"
,表明正在尝试将字符加载到整数列中。