这是 Redshift 的完整工作方法。
假设:
A.S3 中的数据以 gunzip 格式提供,带有 '|' 分隔列,可能有一些垃圾数据,请参阅 maxerror 。
B.Sales 事实带有两个维度表以保持简单(TIME 和 SKU(SKU 可能有许多组和类别))。
C.你有这样的销售表。
CREATE TABLE sales (
sku_id int encode zstd,
date_id int encode zstd,
quantity numeric(10,2) encode delta32k,
);
1) 创建 Staging 表,该表应类似于应用程序使用的 Online Table。
CREATE TABLE stg_sales_onetime (
sku_number varchar(255) encode zstd,
time varchar(255) encode zstd,
qty_str varchar(20) encode zstd,
quantity numeric(10,2) encode delta32k,
sku_id int encode zstd,
date_id int encode zstd
);
2)从 S3 复制数据(这可以使用 SSH 完成)。
copy stg_sales_onetime (sku_number,time,qty_str) from
's3://<buecket_name>/<full_file_path>' CREDENTIALS 'aws_access_key_id=<your_key>;aws_secret_access_key=<your_secret>' delimiter '|' ignoreheader 1 maxerror as 1000 gzip;
3)此步骤是可选的,如果您没有良好的格式化数据,如果需要,这是您的转换步骤(如将 String(12.555654) 数量转换为 Number(12.56))
update stg_sales_onetime set quantity=convert(decimal(10,2),qty_str);
4)从维度表中填充正确的 ID。
update stg_sales_onetime set sku_id=<your_sku_demesion_table>.sku_id from <your_sku_demesion_table> where stg_sales_onetime.sku_number=<your_sku_demesion_table>.sku_number;
update stg_sales_onetime set time_id=<your_time_demesion_table>.time_id from <your_time_demesion_table> where stg_sales_onetime.time=<your_time_demesion_table>.time;
5)您终于有了从 Staging 到 Online Sales 表的数据。
insert into sales(sku_id,time_id,quantity) select sku_id,time_id,quantity from stg_sales_onetime;