【问题标题】:Copying specific Columns in Amazon Redshift from S3 databucket从 S3 数据桶复制 Amazon Redshift 中的特定列
【发布时间】:2016-12-28 18:51:15
【问题描述】:

我在 S3 中有一个文件,其中包含类似的列

CustomerID   CustomerName   ProductID    ProductName   Price   Date

现在Redshift中已有的SQL表结构是这样的

Date  CustomerID   ProductID    Price

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

【问题讨论】:

    标签: amazon-s3 amazon-redshift


    【解决方案1】:

    这适用于文件列数少于目标加载表的情况。

    假设 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;
    

    【讨论】:

    • 反之亦然:目标表的列数少于 S3 的源数据。 copy 命令在这种情况下不起作用,因为它在源数据中遇到的列多于目标表中可用的列。
    • 对不起。您将不得不使用临时表。我发布了2个不同的答案。每个案例一个。很抱歉,我最初误读了您的问题
    • 这不是我的问题;我只是通读了线程并注意到了它。 :)
    【解决方案2】:

    这是针对文件列数多于目标加载表的情况。

    假设 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
    SELECT Date  
      ,CustomerID   
      ,ProductID    
      ,Price
    FROM  staging-tablename st;
    
    TRUNCATE TABLE staging-tablename;
    
    ANALYZE main_tablename;
    

    【讨论】:

      【解决方案3】:

      在 s3 上创建一个外部表并根据需要从中选择特定列并加载到目标表中。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2018-09-12
      • 2016-09-25
      • 2021-08-16
      • 1970-01-01
      • 2013-03-20
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2018-04-25
      相关资源
      最近更新 更多