我在S3中有一个像
这样的列的文件CustomerID CustomerName ProductID ProductName Price Date
现在Redshift中现有的SQL表结构就像
Date CustomerID ProductID Price
有没有办法将选定的数据复制到现有的表结构中? S3数据库没有任何标题,只有这个顺序的数据。
答案 0 :(得分:6)
这适用于文件的列数少于目标加载表的情况。
假设CustomerName和ProductName可以是NULL字段,则有两个选项。
选项#1 - 直接在桌面上加载
COPY main_tablename
(Date
,CustomerID
,ProductID
,Price)
FROM 's3://<<YOUR-BUCKET>>/<<YOUR-FILE>>'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret- access-key>';
ANALYZE main_tablename;
选项#2 - 将数据加载到临时表中。然后使用引用数据连接临时表以将数据插入
COPY staging-tablename
(Date
,CustomerID
,ProductID
,Price)
FROM 's3://<<YOUR-BUCKET>>/<<YOUR-FILE>>'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret- access-key>';
INSERT INTO
main_tablename
SELECT st.CustomerID
,cust.CustomerName
,st.ProductID
,prod.ProductName
,st.Price
,st.Date
FROM staging-tablename st
INNER JOIN customer-tablename cust ON ( cust.CustomerID = st.CustomerID)
INNER JOIN product-tablename prod ON ( prod.ProductID = st.ProductID );
TRUNCATE TABLE staging-tablename;
ANALYZE main_tablename;
答案 1 :(得分:4)
这适用于文件的列数多于目标加载表的情况。
假设CustomerName和ProductName可以是NULL字段,则有两个选项。
将数据加载到临时表中。然后使用引用数据连接临时表以将数据插入
COPY staging-tablename
FROM 's3://<<YOUR-BUCKET>>/<<YOUR-FILE>>'
credentials 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret- access-key>';
INSERT INTO
main_tablename
选择日期
,客户ID
,产品ID
,价钱
FROM staging-tablename st;
TRUNCATE TABLE staging-tablename;
ANALYZE main_tablename;