Tutorial: Massenladen aus Amazon S3 mit COPY¶
Einführung¶
Dieses Tutorial beschreibt, wie Sie Daten aus Dateien in einem bestehenden Amazon Simple Storage Service (Amazon S3)-Bucket in eine Tabelle laden. In diesem Tutorial erfahren Sie Folgendes:
Erstellen benannter Dateiformate, die Ihre Datendateien beschreiben.
Erstellen benannter Stagingobjekte.
Laden von Daten, die sich in Ihrem S3-Bucket befinden, in Snowflake-Tabellen.
Beheben von Fehlern in Ihren Datendateien.
Das Tutorial behandelt das Laden von CSV- und JSON-Daten.
Voraussetzungen¶
Das Tutorial setzt Folgendes voraus:
Sie haben ein Snowflake-Konto, das für die Verwendung von Amazon Web Services (AWS) konfiguriert ist, und Sie haben einen Benutzer mit einer Rolle, die die erforderlichen Berechtigungen zum Erstellen von Datenbank-, Tabellen- und virtuellen Warehouse-Objekten erteilt.
Sie haben SnowSQL installiert.
Eine Anleitung, wie Sie diese Anforderungen erfüllen können, finden Sie unter Snowflake in 20 Minuten.
Snowflake stellt Beispieldatendateien in einem öffentlichen Amazon S3-Bucket zur Verwendung in diesem Tutorial bereit. Bevor Sie beginnen, müssen Sie jedoch eine Datenbank, einige Tabellen und ein virtuelles Warehouse für dieses Tutorial erstellen. Dies sind die grundlegenden Snowflake-Objekte, die für die meisten Snowflake-Aktivitäten benötigt werden.
Allgemeine Informationen zu den Beispieldatendateien¶
Snowflake bietet Beispieldateien, die in einem öffentlichen S3-Bucket bereitgestellt werden.
Bemerkung
Bei regelmäßigem Gebrauch würden Sie Ihre eigenen Datendateien mit der AWS Management Console, dem AWS Command Line Interface oder einer gleichwertigen Clientanwendung bereitstellen. Eine Anleitung dazu finden Sie in der Dokumentation zu Amazon Web Services.
Die Beispieldatendateien enthalten Beispiel-Kontaktinformationen in den folgenden Formaten:
CSV-Dateien, die eine Kopfzeile und fünf Datensätze enthalten. Das Feldtrennzeichen ist das Pipe-Zeichen (
|
). Das folgende Beispiel zeigt eine Kopfzeile und einen Datensatz:ID|lastname|firstname|company|email|workphone|cellphone|streetaddress|city|postalcode 6|Reed|Moses|Neque Corporation|eget.lacus@facilisis.com|1-449-871-0780|1-454-964-5318|Ap #225-4351 Dolor Ave|Titagarh|62631
Eine einzelne Datei im JSON-Format, die ein Array und drei Objekte enthält. Es folgt ein Beispiel für ein Array, das eines der Objekte enthält:
[ { "customer": { "address": "509 Kings Hwy, Comptche, Missouri, 4848", "phone": "+1 (999) 407-2274", "email": "blankenship.patrick@orbin.ca", "company": "ORBIN", "name": { "last": "Patrick", "first": "Blankenship" }, "_id": "5730864df388f1d653e37e6f" } }, ]
Erstellen von Datenbank, Tabellen und Warehouse¶
Führen Sie die folgenden Anweisungen aus, um eine Datenbank, zwei Tabellen (für CSV- und JSON-Daten) und ein virtuelles Warehouse zu erstellen, die für dieses Tutorial benötigt werden. Nachdem Sie das Tutorial abgeschlossen haben, können Sie diese Objekte wieder löschen.
CREATE OR REPLACE DATABASE mydatabase;
CREATE OR REPLACE TEMPORARY TABLE mycsvtable (
id INTEGER,
last_name STRING,
first_name STRING,
company STRING,
email STRING,
workphone STRING,
cellphone STRING,
streetaddress STRING,
city STRING,
postalcode STRING);
CREATE OR REPLACE TEMPORARY TABLE myjsontable (
json_data VARIANT);
CREATE OR REPLACE WAREHOUSE mywarehouse WITH
WAREHOUSE_SIZE='X-SMALL'
AUTO_SUSPEND = 120
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED=TRUE;
Beachten Sie Folgendes:
Die
CREATE DATABASE
-Anweisung erstellt eine Datenbank. Die Datenbank enthält automatisch ein Schema namens „public“.Die
CREATE TABLE
-Anweisungen erstellen Zieltabellen für CSV- und JSON-Daten. Die Tabellen sind temporär, d. h. sie bleiben nur für die Dauer der Benutzersitzung bestehen und sind für andere Benutzer nicht sichtbar.Die
CREATE WAREHOUSE
-Anweisung erstellt ein Warehouse, das zunächst angehalten ist. Die Anweisung legt auchAUTO_RESUME = true
fest, wodurch das Warehouse automatisch gestartet wird, wenn Sie SQL-Anweisungen ausführen, die Computeressourcen benötigen.
Dateiformatobjekte erstellen¶
Wenn Sie Datendateien aus einem S3-Bucket in eine Tabelle laden, müssen Sie das Format der Datei beschreiben und angeben, wie die Daten in der Datei interpretiert und verarbeitet werden sollen. Wenn Sie beispielsweise Daten aus einer CSV-Datei laden, die durch senkrechte Striche voneinander getrennt sind, müssen Sie angeben, dass die Datei das CSV-Format mit dem senkrechten Strich als Trennzeichen verwendet.
Diese Formatinformation geben Sie beim Ausführen des COPY INTO <Tabelle>-Befehls an. Sie können diese Informationen entweder als Option im Befehl angeben (z. B. TYPE = CSV
, FIELD_DELIMITER = '|'
usw.), oder Sie können ein Dateiformatobjekt angeben, das diese Formatinformationen enthält. Sie können ein benanntes Dateiformatobjekt mit dem Befehl CREATE FILE FORMAT erstellen.
In diesem Schritt erstellen Sie Dateiformatobjekte, die das Datenformat der CSV- und JSON-Beispieldaten beschreiben, die für dieses Tutorial bereitgestellt werden.
Erstellen eines Dateiformatobjekts für CSV-Daten¶
Führen Sie den Befehl CREATE FILE FORMAT aus, um das Dateiformat mycsvformat
zu erstellen.
CREATE OR REPLACE FILE FORMAT mycsvformat
TYPE = 'CSV'
FIELD_DELIMITER = '|'
SKIP_HEADER = 1;
Wobei:
TYPE = 'CSV'
gibt den Dateiformattyp der Quelldatei an. CSV ist der Standard-Dateiformattyp.FIELD_DELIMITER = '|'
gibt an, dass das Zeichen „| “ ein Feldtrennzeichen ist. Der Standardwert ist „,“.SKIP_HEADER = 1
zeigt an, dass die Quelldatei eine Kopfzeile enthält. Der COPY-Befehl überspringt diese Kopfzeilen beim Laden von Daten. Der Standardwert ist 0.
Erstellen eines Dateiformatobjekts für JSON-Daten¶
Führen Sie den Befehl CREATE FILE FORMAT aus, um das Dateiformat myjsonformat
zu erstellen.
CREATE OR REPLACE FILE FORMAT myjsonformat TYPE = 'JSON' STRIP_OUTER_ARRAY = TRUE;
Wobei:
TYPE = 'JSON'
gibt den Dateiformattyp der Quelldatei an.STRIP_OUTER_ARRAY = TRUE
weist den COPY-Befehl an, die Wurzelklammern ([]) beim Laden von Daten in die Tabelle wegzulassen.
Stagingobjekte erstellen¶
Ein Stagingbereich gibt an, wo Datendateien gespeichert (d. h. „bereitgestellt“) werden, damit die Daten in den Dateien in eine Tabelle geladen werden können. Ein benannter externer Stagingbereich ist ein Cloudspeicherort, der von Snowflake verwaltet wird. Ein externer Stagingbereich verweist auf Datendateien, die in einem S3-Bucket gespeichert sind. In diesem Fall erstellen wir einen Stagingbereich, der auf die Beispieldatendateien verweist, die für den Abschluss des Tutorials erforderlich sind.
Das Erstellen eines benannten externen Stagingbereichs ist nützlich, wenn Sie möchten, dass mehrere Benutzer oder Prozesse Dateien hochladen. Wenn Sie planen, Datendateien bereitzustellen, die nur von Ihnen selbst oder nur in eine einzelne Tabelle geladen werden, dann können Sie auch einfach entweder Ihren Benutzer-Stagingbereich oder den Tabellen-Stagingbereich verwenden. Weitere Informationen dazu finden Sie unter Massenladen aus Amazon S3.
In diesem Schritt erstellen Sie benannte Stagingbereiche für die verschiedenen Typen von Beispieldatendateien.
Erstellen eines Stagingbereichs für CSV-Datendateien¶
Führen Sie CREATE STAGE aus, um den Stagingbereich my_csv_stage
zu erstellen:
CREATE OR REPLACE STAGE my_csv_stage
FILE_FORMAT = mycsvformat
URL = 's3://snowflake-docs';
Erstellen eines Stagingbereichs für JSON-Datendateien¶
Führen Sie CREATE STAGE aus, um den Stagingbereich my_json_stage
zu erstellen:
CREATE OR REPLACE STAGE my_json_stage
FILE_FORMAT = myjsonformat
URL = 's3://snowflake-docs';
Bemerkung
Bei regelmäßiger Verwendung können Sie beim Erstellen eines Stagingbereichs, der auf Ihre privaten Datendateien verweist, auf eine Speicherintegration verweisen, die mit CREATE STORAGE INTEGRATION von einem Kontoadministrator (d. h. einem Benutzer mit der Rolle ACCOUNTADMIN) oder einer Rolle mit der globalen Berechtigung CREATE INTEGRATION erstellt wurde:
CREATE OR REPLACE STAGE external_stage FILE_FORMAT = mycsvformat URL = 's3://private-bucket' STORAGE_INTEGRATION = myint;
Daten in die Zieltabelle kopieren¶
Führen Sie COPY INTO <Tabelle> aus, um die im Stagingbereich bereitgestellten Daten in die Zieltabellen zu laden.
CSV¶
So laden Sie die Daten aus den CSV-Beispieldateien:
Laden Sie zunächst die Daten aus einer der Dateien im Ordner
/tutorials/dataloading/
mit dem Namencontacts1.csv
in die Tabellemycsvtable
. Führen Sie den folgenden Befehl aus:COPY INTO mycsvtable FROM @my_csv_stage/tutorials/dataloading/contacts1.csv ON_ERROR = 'skip_file';
Wobei:
Die
FROM
-Klausel gibt den Speicherort der Staging-Datendatei an (Stagingbereichsname gefolgt vom Dateinamen).Die
ON_ERROR = 'skip_file'
-Klausel gibt an, was zu tun ist, wenn der COPY-Befehl Fehler in den Dateien feststellt. Wenn in diesem Fall der Befehl in einem der Datensätze einer Datei auf einen Datenfehler stößt, wird diese Datei übersprungen. Wenn Sie keine ON_ERROR-Klausel angeben, wird standardmäßigabort_statement
verwendet, wodurch der COPY-Befehl beim ersten Fehler abgebrochen wird, der bei einem der Datensätze einer Datei auftritt.
Der COPY-Befehl gibt als Ergebnis die Namen der kopierten Dateien und zugehörige Informationen zurück:
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------| | s3://snowflake-docs/tutorials/dataloading/contacts1.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Laden Sie den Rest der Stagingdateien in die Tabelle
mycsvtable
.Im folgenden Beispiel wird die Mustererkennung verwendet, um Daten aus Dateien, die mit dem regulären Ausdruck
.*contacts[1-5].csv
übereinstimmen, in die Tabellemycsvtable
zu laden.COPY INTO mycsvtable FROM @my_csv_stage/tutorials/dataloading/ PATTERN='.*contacts[1-5].csv' ON_ERROR = 'skip_file';
Dabei gibt die
PATTERN
-Klausel an, dass der Befehl Daten aus Dateien mit Namen laden soll, die mit dem regulären Ausdruck.*contacts[1-5].csv
übereinstimmen.Der COPY-Befehl gibt als Ergebnis die Namen der kopierten Dateien und zugehörige Informationen zurück:
+---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+ | file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name | |---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------| | s3://snowflake-docs/tutorials/dataloading/contacts2.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | | s3://snowflake-docs/tutorials/dataloading/contacts3.csv | LOAD_FAILED | 5 | 0 | 1 | 2 | Number of columns in file (11) does not match that of the corresponding table (10), use file format option error_on_column_count_mismatch=false to ignore this error | 3 | 1 | "MYCSVTABLE"[11] | | s3://snowflake-docs/tutorials/dataloading/contacts4.csv | LOADED | 5 | 5 | 1 | 0 | NULL | NULL | NULL | NULL | | s3://snowflake-docs/tutorials/dataloading/contacts5.csv | LOADED | 6 | 6 | 1 | 0 | NULL | NULL | NULL | NULL | +---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
Das Ergebnis liefert die folgenden Informationen:
Die Daten in
contacts1.csv
werden ignoriert, da Sie die Daten bereits erfolgreich geladen haben.Die Daten folgender Dateien wurden erfolgreich geladen:
contacts2.csv
,contacts4.csv
undcontacts5.csv
.Die Daten in
contacts3.csv
wurden aufgrund von 2 Datenfehlern übersprungen. Der nächste Schritt in diesem Tutorial befasst sich mit der Validierung und Behebung der Fehler.
JSON¶
Laden Sie die Staging-Datendatei contacts.json
in die Tabelle myjsontable
.
COPY INTO myjsontable FROM @my_json_stage/tutorials/dataloading/contacts.json ON_ERROR = 'skip_file';
COPY gibt ein Ergebnis zurück, das den Namen der kopierten Datei und zugehörige Informationen enthält:
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
| file | status | rows_parsed | rows_loaded | error_limit | errors_seen | first_error | first_error_line | first_error_character | first_error_column_name |
|---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------|
| s3://snowflake-docs/tutorials/dataloading/contacts.json | LOADED | 3 | 3 | 1 | 0 | NULL | NULL | NULL | NULL |
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Bereinigen¶
Herzlichen Glückwunsch, Sie haben das Tutorial erfolgreich abgeschlossen.
Tutorialdaten bereinigen (optional)¶
Führen Sie die folgenden DROP <Objekt>-Befehle aus, um Ihr System in den Zustand zu versetzen, bevor Sie das Tutorial begonnen haben:
DROP DATABASE IF EXISTS mydatabase; DROP WAREHOUSE IF EXISTS mywarehouse;
Wenn Sie die Datenbank löschen, werden automatisch alle untergeordneten Datenbankobjekte wie Tabellen entfernt.