从S3 databucket复制Amazon Redshift中的特定列

时间:2016-08-22 09:26:18

标签: amazon-s3 amazon-redshift

我在S3中有一个像

这样的列的文件
CustomerID   CustomerName   ProductID    ProductName   Price   Date

现在Redshift中现有的SQL表结构就像

Date  CustomerID   ProductID    Price

有没有办法将选定的数据复制到现有的表结构中? S3数据库没有任何标题,只有这个顺序的数据。

2 个答案:

答案 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;