2016-08-22 67 views
2

我在S3與列的文件例如像複製特定列

CustomerID CustomerName ProductID ProductName Price Date 

現在紅移現有的SQL表結構LIK

Date CustomerID ProductID Price 

反正是有在現有表結構中複製選定的數據? S3數據庫沒有任何標題,只是數據的順序。

回答

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 選擇日期
,客戶ID
,產品ID
,價格 從登臺,表名ST;

TRUNCATE TABLE staging-tablename;

ANALYZE main_tablename;

2

這是針對文件的列數少於目標裝載表的情況。

假設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; 
+0

反過來:目標表的列數少於S3中的源數據。在這種情況下,'copy'命令不起作用,因爲它在源數據中遇到的列數多於目標表中可用的列數。 – moertel

+0

我很抱歉。你將不得不使用登臺表。我發佈了2個不同的答案。每個案件一個。對不起,我最初誤解了你的問題 – BigDataKid

+0

這不是我的問題;我只是通過線程閱讀並注意到它。 :) – moertel