2016-08-22 1 views
2

I mit Säulen wie zum Beispiel eine Datei in S3 habenKopieren bestimmte Spalten in Amazon Redshift von S3 databucket

CustomerID CustomerName ProductID ProductName Price Date 

nun die bestehende SQL-Tabellenstruktur in Redshift ist lik

Date CustomerID ProductID Price 

Gibt es trotzdem die ausgewählten Daten in die bestehende Tabellenstruktur kopieren? Die S3-Datenbank hat keine Header, sondern nur die Daten in der Reihenfolge.

Antwort

2

Dies ist für den Fall, wenn die Datei mehr Spalten als die Ziellasttabelle hat.

Angenommen, dass CustomerName und ProductName NULL-Felder sein können, haben Sie zwei Möglichkeiten.

Laden Sie die Daten in eine Staging-Tabelle. Dann treten Sie die Staging-Tabelle mit den Referenzdaten Daten in

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 Datum einfügen
, CustomerID
, ProductID
, Preis FROM Staging-name st;

TRUNCATE TABLE Staging-Tabellenname;

ANALYZE main_tablename;

2

Dies ist für den Fall, dass die Datei weniger Spalten als die Ziellasttabelle hat.

Angenommen, dass CustomerName und ProductName NULL-Felder sein können, haben Sie zwei Möglichkeiten.

Option # 1 - Last direkt auf den Tisch

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; 

Option # 2 - die Daten in einem Zwischenspeichertabelle laden. Fügen Sie dann die Zwischenspeichertabelle mit den Referenzdaten zum Einfügen von Daten in

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

Es ist umgekehrt: Die Zieltabelle hat weniger Spalten als die Quelldaten in S3. Der Befehl 'copy' funktioniert in diesem Fall nicht, weil er mehr Spalten in den Quelldaten findet, als in der Zieltabelle verfügbar sind. – moertel

+0

Es tut mir leid. Sie müssten eine Zwischenspeichertabelle verwenden. Ich habe 2 verschiedene Antworten gepostet. eine für jeden Fall. Es tut mir leid, dass ich deine Frage anfangs falsch gelesen habe – BigDataKid

+0

Es war nicht meine Frage; Ich habe gerade den Thread gelesen und es bemerkt. :) – moertel

Verwandte Themen