Hinweise zum Entladen von Daten

Unter diesem Thema werden bewährte Verfahren, allgemeine Richtlinien und wichtige Hinweise zum Entladen von Daten aus einer Tabelle bereitgestellt. Diese sollen dazu beitragen, den Export von Daten aus Snowflake-Tabellen in Dateien mit dem Befehl COPY INTO <Speicherort> schrittweise zu vereinfachen.

Unter diesem Thema:

Leere Zeichenfolgen und NULL-Werte

Eine leere Zeichenfolge ist eine Zeichenfolge mit einer Länge von null oder ohne Zeichen, während NULL-Werte eine Abwesenheit von Daten darstellen. In CSV-Dateien wird ein NULL-Wert typischerweise durch zwei aufeinanderfolgende Trennzeichen (z. B. ,,) dargestellt, um anzuzeigen, dass das Feld keine Daten enthält. Sie können zum Kennzeichnen von NULL aber auch Zeichenfolgewerte (z. B. null) oder jede eindeutige Zeichenfolge verwenden. Eine leere Zeichenfolge wird typischerweise durch eine in Anführungszeichen geschriebene, leere Zeichenfolge dargestellt (z. B. ''), um anzuzeigen, dass die Zeichenfolge null Zeichen enthält.

Die folgenden Dateiformatoptionen ermöglichen es Ihnen, beim Entladen oder Laden von Daten zwischen leeren Zeichenfolgen und NULL-Werten zu unterscheiden. Weitere Informationen zu diesen Dateiformaten finden Sie unter CREATE FILE FORMAT:

FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE

Verwenden Sie diese Option, um Zeichenfolgen in das angegebene Zeichen einzuschließen: einfaches Anführungszeichen ('), doppeltes Anführungszeichen (") oder NONE.

Das Einschließen von Zeichenfolgewerten in Anführungszeichen beim Entladen von Daten ist nicht erforderlich. Mit dem Befehl COPY INTO können leere Zeichenfolgewerte ohne Verwendung von Anführungszeichen entladen werden, wobei die Option EMPTY_FIELD_AS_NULL auf FALSE gesetzt ist. Wenn die Option EMPTY_FIELD_AS_NULL auf TRUE gesetzt ist (was nicht erlaubt ist), dann können leere Zeichenfolgen und NULL-Werte in der Ausgabedatei nicht unterschieden werden.

Wenn ein Feld dieses Zeichen enthält, können Sie es mit dem gleichen Zeichen löschen. Wenn der Wert beispielsweise das doppelte Anführungszeichen ist und ein Feld die Zeichenfolge "A" enthält, werden die doppelten Anführungszeichen wie folgt gelöscht: ""A"".

Standard: NONE

EMPTY_FIELD_AS_NULL = TRUE | FALSE
  • Wenn Sie leere Zeichenfolgedaten aus Tabellen entladen, stehen Ihnen folgende Optionen zur Auswahl:

    • Bevorzugt: Schließen Sie Zeichenfolgen in Anführungszeichen ein, indem Sie die Option FIELD_OPTIONALLY_ENCLOSED_BY setzen. Damit lassen sich in CSV-Ausgabedateien leere Zeichenfolgen von NULL-Werten unterscheiden.

    • Lassen Sie Zeichenfolgefelder offen, indem Sie die Option FIELD_OPTIONALLY_ENCLOSED_BY auf NONE (Standard) und den Wert EMPTY_FIELD_AS_NULL auf FALSE setzen. Dadurch werden leere Zeichenfolgen als leere Felder entladen.

      Wichtig

      Wenn Sie diese Option wählen, müssen Sie mit der Option NULL_IF eine Ersetzungszeichenfolge für NULL-Daten angeben, damit in der Ausgabedatei NULL-Werte von leeren Zeichenfolgen unterschieden werden können. Wenn Sie später Daten aus den Ausgabedateien laden möchten, geben Sie den gleichen NULL_IF-Wert an, um die NULL-Werte in den Datendateien zu identifizieren.

  • Verwenden Sie diese Option, um beim Laden von Daten in Tabellen anzugeben, ob in einer Eingabedatei SQL NULL für leere Felder eingefügt werden soll. Wenn der Wert FALSE ist, versucht Snowflake, einem leeren Feld den entsprechenden Spaltentyp zuzuweisen. In Spalten vom Datentyp STRING wird eine leere Zeichenfolge eingefügt. Für andere Spaltentypen generiert der COPY-Befehl einen Fehler.

Standard: TRUE

NULL_IF = ( 'string1' [ , 'string2' ... ] )

Beim Entladen von Daten aus Tabellen: Konvertiert Snowflake SQL-NULL-Werte in den ersten Wert der Liste. Achten Sie darauf, einen Wert anzugeben, der als NULL interpretiert werden soll. Wenn Sie beispielsweise Daten in eine Datei entladen, die von einem anderen System gelesen wird, müssen Sie einen Wert angeben, der von diesem System als NULL interpretiert wird.

Standard: \\N (d. h. NULL mit der Annahme, dass der ESCAPE_UNENCLOSED_FIELD-Wert \\ (Standard) ist)

Beispiel: Entladen und Laden von Daten unter Verwendung von Anführungszeichen

Im folgenden Beispiel wird ein Datensatz aus der Tabelle null_empty1 in den Stagingbereich des Benutzers entladen. Die Ausgabedatendatei wird dann verwendet, um Daten in die Tabelle null_empty2 zu laden:

-- Source table (null_empty1) contents
+---+------+--------------+
| i | V    | D            |
|---+------+--------------|
| 1 | NULL | NULL value   |
| 2 |      | Empty string |
+---+------+--------------+

-- Create a file format that describes the data and the guidelines for processing it
create or replace file format my_csv_format
  field_optionally_enclosed_by='0x27' null_if=('null');

-- Unload table data into a stage
copy into @mystage
  from null_empty1
  file_format = (format_name = 'my_csv_format');

-- Output the data file contents
1,'null','NULL value'
2,'','Empty string'

-- Load data from the staged file into the target table (null_empty2)
copy into null_empty2
    from @mystage/data_0_0_0.csv.gz
    file_format = (format_name = 'my_csv_format');

select * from null_empty2;

+---+------+--------------+
| i | V    | D            |
|---+------+--------------|
| 1 | NULL | NULL value   |
| 2 |      | Empty string |
+---+------+--------------+
Copy

Beispiel: Entladen und Laden von Daten ohne Verwendung von Anführungszeichen

Im folgenden Beispiel wird ein Datensatz aus der Tabelle null_empty1 in den Stagingbereich des Benutzers entladen. Die Ausgabedatendatei wird dann verwendet, um Daten in die Tabelle null_empty2 zu laden:

-- Source table (null_empty1) contents
+---+------+--------------+
| i | V    | D            |
|---+------+--------------|
| 1 | NULL | NULL value   |
| 2 |      | Empty string |
+---+------+--------------+

-- Create a file format that describes the data and the guidelines for processing it
create or replace file format my_csv_format
  empty_field_as_null=false null_if=('null');

-- Unload table data into a stage
copy into @mystage
  from null_empty1
  file_format = (format_name = 'my_csv_format');

-- Output the data file contents
1,null,NULL value
2,,Empty string

-- Load data from the staged file into the target table (null_empty2)
copy into null_empty2
    from @mystage/data_0_0_0.csv.gz
    file_format = (format_name = 'my_csv_format');

select * from null_empty2;

+---+------+--------------+
| i | V    | D            |
|---+------+--------------|
| 1 | NULL | NULL value   |
| 2 |      | Empty string |
+---+------+--------------+
Copy

Entladen in eine einzelne Datei

Standardmäßig werden mit COPY INTO-Anweisungen Tabellendaten in einen Satz von Ausgabedateien aufgeteilt, um die Vorteile paralleler Operationen zu nutzen. Die maximale Größe für jede Datei wird mit der Kopieroption MAX_FILE_SIZE eingestellt. Der Standardwert ist 16777216 (16 MB), kann aber erhöht werden, um größere Dateien aufzunehmen. Die maximal unterstützte Dateigröße beträgt 5 GB für Amazon S3-, Google Cloud Storage- und Microsoft Azure-Stagingbereiche.

Um die Daten in einer einzigen Ausgabedatei zu entladen (unter Inkaufnahme einer potenziell geringeren Leistung), geben Sie die Kopieroption SINGLE = true in Ihrer Anweisung an. Sie können für die Datei im Pfad optional einen Namen angeben.

Bemerkung

Wenn die Option COMPRESSION auf „true“ gesetzt ist, geben Sie einen Dateinamen mit der entsprechenden Dateierweiterung für die Komprimierungsmethode an, damit die Ausgabedatei entpackt werden kann. Geben Sie beispielsweise die Dateiendung GZ an, wenn die Komprimierungsmethode GZIP angegeben ist.

Entladen Sie beispielsweise die mytable-Tabellendaten in eine einzelne Datei mit dem Namen myfile.csv in einen benannten Stagingbereich. Erhöhen Sie die MAX_FILE_SIZE-Grenze, um das große Dataset aufnehmen zu können:

copy into @mystage/myfile.csv.gz from mytable
file_format = (type=csv compression='gzip')
single=true
max_file_size=4900000000;
Copy

Entladen einer relationalen Tabelle nach JSON

Sie können die Funktion OBJECT_CONSTRUCT in Kombination mit dem Befehl COPY verwenden, um die Zeilen einer relationalen Tabelle in eine einzige VARIANT-Spalte zu konvertieren und die Zeilen in eine Datei zu entladen.

Beispiel:

-- Create a table
CREATE OR REPLACE TABLE mytable (
 id number(8) NOT NULL,
 first_name varchar(255) default NULL,
 last_name varchar(255) default NULL,
 city varchar(255),
 state varchar(255)
);

-- Populate the table with data
INSERT INTO mytable (id,first_name,last_name,city,state)
 VALUES
 (1,'Ryan','Dalton','Salt Lake City','UT'),
 (2,'Upton','Conway','Birmingham','AL'),
 (3,'Kibo','Horton','Columbus','GA');

-- Unload the data to a file in a stage
COPY INTO @mystage
 FROM (SELECT OBJECT_CONSTRUCT('id', id, 'first_name', first_name, 'last_name', last_name, 'city', city, 'state', state) FROM mytable)
 FILE_FORMAT = (TYPE = JSON);

-- The COPY INTO location statement creates a file named data_0_0_0.json.gz in the stage.
-- The file contains the following data:

{"city":"Salt Lake City","first_name":"Ryan","id":1,"last_name":"Dalton","state":"UT"}
{"city":"Birmingham","first_name":"Upton","id":2,"last_name":"Conway","state":"AL"}
{"city":"Columbus","first_name":"Kibo","id":3,"last_name":"Horton","state":"GA"}
Copy

Entladen einer relationalen Tabelle nach Parquet mit mehreren Spalten

Sie können Daten in eine mehrspaltige Parquet-Datei entladen, indem Sie eine SELECT-Anweisung als Eingabe für eine COPY-Anweisung verwenden. Die SELECT-Anweisung gibt die Spaltendaten in der relationalen Tabelle an, die in die entladene Datei aufgenommen werden sollen. Verwenden Sie die Kopieroption HEADER = TRUE, um die Spaltennamen in die Ausgabe aufzunehmen.

Entladen Sie beispielsweise die Zeilen von drei Spalten (id, name, start_date) der Tabelle mytable in eine oder mehrere Dateien, die das Namensformat myfile.parquet aufweisen:

COPY INTO @mystage/myfile.parquet FROM (SELECT id, name, start_date FROM mytable)
  FILE_FORMAT=(TYPE='parquet')
  HEADER = TRUE;
Copy

Explizites Konvertieren numerischer Spalten in Parquet-Datentypen

Standardmäßig werden beim Entladen von Tabellendaten in Parquet-Dateien die Festkommazahlen als DECIMAL-Spalten entladen, während die Gleitkommazahlen-Spalten in DOUBLE-Spalten entladen werden.

Um die Parquet-Datentypen für Mengen von entladenen Daten auszuwählen und bestimmte Tabellenspalten in explizite Datentypen zu konvertieren, rufen Sie in der COPY INTO <Speicherort>-Anweisung die Funktion CAST, :: auf. Eine Abfrage in einer COPY INTO <Speicherort>-Anweisung ermöglicht die Auswahl bestimmter zu entladender Spalten und akzeptiert SQL-Konvertierungsfunktionen zur Umwandlung der Spaltendaten.

Abfragen in COPY INTO <Speicherort>-Anweisungen unterstützen die Syntax und Semantik von SELECT-Anweisungen, um bestimmte Snowflake-Tabellenspalten zum Entladen abzufragen. Konvertieren Sie Daten in numerischen Spalten mit der Funktion CAST, :: in bestimmte Datentypen.

In der folgenden Tabelle sind numerische Snowflake-Datentypen physischen und logischen Parquet-Datentypen zugeordnet:

Logischer Snowflake-Datentyp

Physischer Parquet-Datentyp

Logischer Parquet-Datentyp

TINYINT

INT32

INT(8)

SMALLINT

INT32

INT(16)

INT

INT32

INT(32)

BIGINT

INT64

INT(64)

FLOAT

FLOAT

N/A

DOUBLE

DOUBLE

N/A

Das folgende Beispiel zeigt eine COPY INTO <Speicherort>-Anweisung, die die numerischen Daten in jeder entladenen Spalte in einen anderen Datentyp konvertiert, um die Datentypen in den Parquet-Dateien explizit auszuwählen:

COPY INTO @mystage
FROM (SELECT CAST(C1 AS TINYINT) ,
             CAST(C2 AS SMALLINT) ,
             CAST(C3 AS INT),
             CAST(C4 AS BIGINT) FROM mytable)
FILE_FORMAT=(TYPE=PARQUET);
Copy

Abgeschnittene Gleitkommazahlen

Wenn Spalten mit Gleitkommazahlen in CSV- oder JSON-Dateien entladen werden, schneidet Snowflake die Werte auf ungefähr (15,9) ab.

Die Werte werden nicht abgeschnitten, wenn Spalten mit Gleitkommazahlen in Parquet-Dateien entladen werden.