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
aufNONE
(Standard) und den WertEMPTY_FIELD_AS_NULL
aufFALSE
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 gleichenNULL_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 derESCAPE_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 |
+---+------+--------------+
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 |
+---+------+--------------+
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;
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"}
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;
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);
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.