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
    
    Copy
  • 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"
       }
     },
    ]
    
    Copy

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;
Copy

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 auch AUTO_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;
Copy

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;
Copy

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';
Copy

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';
Copy

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;
Copy

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:

  1. Laden Sie zunächst die Daten aus einer der Dateien im Ordner /tutorials/dataloading/ mit dem Namen contacts1.csv in die Tabelle mycsvtable. Führen Sie den folgenden Befehl aus:

    COPY INTO mycsvtable
      FROM @my_csv_stage/tutorials/dataloading/contacts1.csv
      ON_ERROR = 'skip_file';
    
    Copy

    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äßig abort_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 |
    +---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
    
    Copy
  2. 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 Tabelle mycsvtable zu laden.

    COPY INTO mycsvtable
      FROM @my_csv_stage/tutorials/dataloading/
      PATTERN='.*contacts[1-5].csv'
      ON_ERROR = 'skip_file';
    
    Copy

    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                    |
    +---------------------------------------------------------+-------------+-------------+-------------+-------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------+-----------------------+-------------------------+
    
    Copy

    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 und contacts5.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

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 |
+---------------------------------------------------------+--------+-------------+-------------+-------------+-------------+-------------+------------------+-----------------------+-------------------------+
Copy

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;
Copy

Wenn Sie die Datenbank löschen, werden automatisch alle untergeordneten Datenbankobjekte wie Tabellen entfernt.

Weitere Tutorials zum Laden von Daten