CREATE EXTERNAL TABLE¶
Erstellt eine neue externe Tabelle im aktuellen/angegebenen Schema oder ersetzt eine bestehende externe Tabelle. Bei Abfragen liest eine externe Tabelle Daten aus einer Gruppe von einer oder mehreren Dateien in einem angegebenen externen Stagingbereich und gibt die Daten in einer einzelnen VARIANT-Spalte aus.
Zusätzliche Spalten können definiert werden, wobei jede Spaltendefinition aus einem Namen, einem Datentyp und optional der Angabe besteht, ob für die Spalte ein Wert (NOT NULL) erforderlich ist oder ob für die referenzielle Integrität Einschränkungen gelten (Primärschlüssel, Fremdschlüssel usw.). Weitere Informationen dazu finden Sie in den Nutzungshinweisen.
Syntax¶
-- Partitions computed from expressions
CREATE [ OR REPLACE ] EXTERNAL TABLE [IF NOT EXISTS]
<table_name>
( [ <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ]
[ inlineConstraint ]
[ , <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ... ]
[ , ... ] )
cloudProviderParams
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
[ WITH ] LOCATION = externalStage
[ REFRESH_ON_CREATE = { TRUE | FALSE } ]
[ AUTO_REFRESH = { TRUE | FALSE } ]
[ PATTERN = '<regex_pattern>' ]
FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET } [ formatTypeOptions ] } )
[ AWS_SNS_TOPIC = '<string>' ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
-- Partitions added and removed manually
CREATE [ OR REPLACE ] EXTERNAL TABLE [IF NOT EXISTS]
<table_name>
( [ <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ]
[ inlineConstraint ]
[ , <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ... ]
[ , ... ] )
cloudProviderParams
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
[ WITH ] LOCATION = externalStage
PARTITION_TYPE = USER_SPECIFIED
FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET } [ formatTypeOptions ] } )
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
-- Delta Lake
CREATE [ OR REPLACE ] EXTERNAL TABLE [IF NOT EXISTS]
<table_name>
( [ <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ]
[ inlineConstraint ]
[ , <col_name> <col_type> AS <expr> | <part_col_name> <col_type> AS <part_expr> ... ]
[ , ... ] )
cloudProviderParams
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
[ WITH ] LOCATION = externalStage
PARTITION_TYPE = USER_SPECIFIED
FILE_FORMAT = ( { FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET } [ formatTypeOptions ] } )
[ TABLE_FORMAT = DELTA ]
[ COPY GRANTS ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] ROW ACCESS POLICY <policy_name> ON (VALUE) ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
Wobei:
inlineConstraint ::= [ NOT NULL ] [ CONSTRAINT <constraint_name> ] { UNIQUE | PRIMARY KEY | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> ] ) ] } [ <constraint_properties> ]Weitere Details zu Inline-Einschränkungen finden Sie unter CREATE | ALTER TABLE … CONSTRAINT.
cloudProviderParams (for Google Cloud Storage) ::= [ INTEGRATION = '<integration_name>' ] cloudProviderParams (for Microsoft Azure) ::= [ INTEGRATION = '<integration_name>' ]externalStage ::= @[<namespace>.]<ext_stage_name>[/<path>]formatTypeOptions ::= -- If FILE_FORMAT = ( TYPE = CSV ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE RECORD_DELIMITER = '<character>' | NONE FIELD_DELIMITER = '<character>' | NONE SKIP_HEADER = <integer> SKIP_BLANK_LINES = TRUE | FALSE ESCAPE_UNENCLOSED_FIELD = '<character>' | NONE TRIM_SPACE = TRUE | FALSE FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | NONE NULL_IF = ( '<string1>' [ , '<string2>' , ... ] ) EMPTY_FIELD_AS_NULL = TRUE | FALSE ENCODING = '<string>' -- If FILE_FORMAT = ( TYPE = JSON ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE ALLOW_DUPLICATE = TRUE | FALSE STRIP_OUTER_ARRAY = TRUE | FALSE STRIP_NULL_VALUES = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE -- If FILE_FORMAT = ( TYPE = AVRO ... ) COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE REPLACE_INVALID_CHARACTERS = TRUE | FALSE -- If FILE_FORMAT = ( TYPE = ORC ... ) TRIM_SPACE = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE NULL_IF = ( '<string>' [ , '<string>' ... ] -- If FILE_FORMAT = ( TYPE = PARQUET ... ) COMPRESSION = AUTO | SNAPPY | NONE BINARY_AS_TEXT = TRUE | FALSE REPLACE_INVALID_CHARACTERS = TRUE | FALSE
Syntaxvariante¶
CREATE EXTERNAL TABLE … USING TEMPLATE¶
Erstellt eine neue externe Tabelle mit Spaltendefinitionen, die aus einer Menge von Stagingdateien mit semistrukturierten Daten abgeleitet sind. Diese Feature unterstützt Apache Parquet-, Apache Avro-, ORC-, JSON- und CSV-Dateien. Die Unterstützung für CSV- und JSON-Dateien befindet sich derzeit in der Vorschau.
CREATE [ OR REPLACE ] EXTERNAL TABLE <table_name> [ COPY GRANTS ] USING TEMPLATE <query> [ ... ]
Bemerkung
Wenn die Anweisung eine vorhandene Tabelle mit demselben Namen ersetzt, werden die Berechtigungen aus der zu ersetzenden Tabelle kopiert. Wenn keine Tabelle mit diesem Namen vorhanden ist, werden die Berechtigungen aus der zu klonenden Quelltabelle kopiert.
Weitere Informationen zu COPY GRANTS finden Sie in diesem Dokument unter COPY GRANTS.
Erforderliche Parameter¶
table_name
Zeichenfolge, die den Bezeichner (d. h. den Namen) für die Tabelle angibt; muss für das Schema, in dem die Tabelle erstellt wird, eindeutig sein.
Darüber hinaus muss der Bezeichner mit einem Buchstaben beginnen und darf keine Leer- oder Sonderzeichen enthalten, es sei denn, die gesamte Bezeichnerzeichenfolge wird in doppelte Anführungszeichen gesetzt (z. B.
"My object"
). Bei Bezeichnern, die in doppelte Anführungszeichen eingeschlossen sind, ist auch die Groß-/Kleinschreibung zu beachten.Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.
[ WITH ] LOCATION =
Gibt den externen Stagingbereich und einen optionalen Pfad an, wo die Dateien mit den zu lesenden Daten bereitgestellt werden:
@[namespace.]ext_stage_name[/path]
Die Dateien befinden sich im angegebenen, benannten externen Stagingbereich.
Es werden weder Zeichenfolgenliterale noch SQL-Variablen unterstützt.
Wobei:
namespace
ist die Datenbank und/oder das Schema, in dem sich der externe Stagingbereich befindet, in der Formdatabase_name.schema_name
oderschema_name
. Die Angabe ist optional, wenn in der Benutzersitzung aktuell eine Datenbank und ein Schema verwendet werden, andernfalls ist die Angabe obligatorisch.path
ist ein optionaler Pfad mit Unterscheidung von Groß-/Kleinschreibung für Dateien am Cloudspeicherort (d. h. Dateien haben Namen, die mit einer gemeinsamen Zeichenfolge beginnen), wodurch die zu ladenden Dateien eingegrenzt werden. Pfade werden von den verschiedenen Cloudspeicherdiensten alternativ als Präfixe oder Ordner bezeichnet.Die externe Tabelle fügt diesen Pfad an jeden in der Stagingbereichsdefinition angegebenen Pfad an. Führen Sie zum Anzeigen der Stagingbereichsdefinition
DESC STAGE stage_name
aus, und überprüfen Sie den Eigenschaftswerturl
. Wenn die URL des Stagingbereichs beispielsweise den Pfada
enthält und der Speicherort der externen Tabelle den Pfadb
enthält, liest die externe Tabelle Dateien, die instage/a/b
bereitgestellt wurden.Beachten Sie, dass der
[ WITH ] LOCATION
-Wert nicht auf bestimmte Dateinamen verweisen kann. Wenn eine externe Tabelle auf einzelne Stagingdateien verweisen soll, verwenden Sie den ParameterPATTERN
.
FILE_FORMAT = ( FORMAT_NAME = 'file_format_name' )
oder .FILE_FORMAT = ( TYPE = CSV | JSON | AVRO | ORC | PARQUET [ ... ] )
Zeichenfolge (Konstante), die das Dateiformat angibt:
FORMAT_NAME = file_format_name
Gibt ein vorhandenes benanntes Dateiformat an, das die zu überprüfenden bereitgestellten Datendateien beschreibt. Das benannte Dateiformat bestimmt über den Formattyp (CSV, JSON usw.) sowie alle anderen Formatoptionen für Datendateien.
TYPE = CSV | JSON | AVRO | ORC | PARQUET [ ... ]
Gibt den Formattyp der bereitgestellten Datendateien an, die beim Abfragen der externen Tabelle geprüft werden sollen.
Wenn ein Dateiformattyp angegeben wird, können zusätzliche formatspezifische Optionen angegeben werden. Weitere Informationen dazu finden Sie unter Formattypoptionen (unter diesem Thema).
Die Dateiformatoptionen können entweder auf der Ebene der externen Tabelle oder des Stagingbereichs konfiguriert werden. Alle Einstellungen, die auf der Ebene der externen Tabelle festgelegt werden, haben Vorrang. Alle Einstellungen, die auf keiner Ebene festgelegt werden, gehen von den Standardwerten aus.
Standard:
TYPE = CSV
.Wichtig
Die externe Tabelle erbt nicht das Dateiformat, falls dieses in der Stagingbereichsdefinition vorhanden ist. Sie müssen alle Dateiformatoptionen für die externe Tabelle mit dem Parameter FILE_FORMAT explizit festlegen.
Bemerkung
FORMAT_NAME
undTYPE
schließen sich gegenseitig aus. Um unbeabsichtigtes Verhalten zu vermeiden, sollten Sie beim Erstellen einer externen Tabelle nur einen von beiden Werten angeben.
Optionale Parameter¶
col_name
Zeichenfolge, die den Spaltenbezeichner (z. B. Name) angibt. Alle Anforderungen an Tabellenbezeichner gelten auch für Spaltenbezeichner.
Weitere Details dazu finden Sie unter Anforderungen an Bezeichner.
col_type
Zeichenfolge (Konstante), die den Datentyp für die Spalte angibt. Der Datentyp der Spalte muss mit dem Ergebnis von
expr
übereinstimmen.Einzelheiten zu den Datentypen, die für Tabellenspalten angegeben werden können, finden Sie unter Referenz der SQL-Datentypen.
expr
Zeichenfolge, die den Ausdruck für die Spalte angibt. Bei einer Abfrage gibt die Spalte Ergebnisse zurück, die von diesem Ausdruck abgeleitet sind.
Externe Tabellenspalten sind virtuelle Spalten, die mit einem expliziten Ausdruck definiert werden. Fügen Sie virtuelle Spalten als Ausdrücke hinzu, indem Sie die VALUE-Spalte und/oder die METADATA$FILENAME-Pseudospalte verwenden:
- VALUE:
Eine Spalte vom Typ VARIANT, die eine einzelne Zeile in der externen Datei darstellt.
- CSV:
Die VALUE-Spalte strukturiert jede Zeile als ein Objekt mit Elementen, die durch die Spaltenposition identifiziert werden (d. h.
{c1: <Spalte_1_Wert>, c2: <Spalte_2_Wert>, c3: <Spalte_1_Wert> ...}
).Fügen Sie z. B. eine VARCHAR-Spalte mit dem Namen
mycol
hinzu, die auf die erste Spalte in den CSV-Stagingdateien verweist:mycol varchar as (value:c1::varchar)
- Semistrukturierte Daten:
Schließen Sie Elementnamen und Werte in doppelte Anführungszeichen ein. Durchlaufen Sie den Pfad in der VALUE-Spalte mithilfe der punktierten Schreibweise.
Nehmen wir zum Beispiel an, dass das Folgende eine einzelne Zeile mit semistrukturierten Daten in einer Stagingdatei darstellt:
{ "a":"1", "b": { "c":"2", "d":"3" } }
Fügen Sie eine VARCHAR-Spalte mit dem Namen
mycol
hinzu, die auf das verschachtelte, sich wiederholende Elementc
in der Stagingdatei verweist:mycol varchar as (value:"b"."c"::varchar)
- METADATA$FILENAME:
Eine Pseudospalte, die den Namen jeder in der externen Tabelle enthaltenen Staging-Datendatei einschließlich ihres Pfads im Stagingbereich angibt. Ein Beispiel finden Sie unter Automatisch aus Partitionsspaltenausdrücken hinzugefügte Partitionen (unter diesem Thema).
CONSTRAINT ...
Zeichenfolge, die eine Inline- oder Out-of-Line-Beschränkung für die angegebenen Spalten in der Tabelle definiert.
Weitere Informationen zur Syntax finden Sie unter CREATE | ALTER TABLE … CONSTRAINT. Weitere Informationen zu Einschränkungen finden Sie unter Einschränkungen.
REFRESH_ON_CREATE = TRUE | FALSE
Gibt an, ob die Metadaten der externen Tabelle sofort nach dem Erstellen automatisch aktualisiert werden sollen. Durch das Aktualisieren der Metadaten der externen Tabelle werden die Metadaten mit der aktuellen Liste der Datendateien im angegebenen Stagingbereichspfad synchronisiert. Diese Aktion ist erforderlich, damit die Metadaten alle vorhandenen Datendateien in dem in der Einstellung
[ WITH ] LOCATION =
angegebenen externen Stagingbereich registrieren.TRUE
Snowflake aktualisiert die Metadaten der externen Tabelle nach der Erstellung einmal automatisch.
Bemerkung
Wenn der angegebene Speicherort fast 1 Millionen Dateien oder mehr enthält, empfehlen wir Ihnen,
REFRESH_ON_CREATE = FALSE
einzustellen. Nachdem Sie die externe Tabelle erstellt haben, aktualisieren Sie schrittweise die Metadaten durch Ausführen von ALTER EXTERNAL TABLE … REFRESH-Anweisungen unter Angabe der Unterpfade am Speicherort (d. h. Teilmengen von Dateien, die in die Aktualisierung einbezogen werden sollen), bis die Metadaten alle Dateien am Speicherort berücksichtigen.FALSE
Snowflake aktualisiert die Metadaten der externen Tabelle nicht automatisch. Um im Stagingbereich vorhandene Datendateien zu registrieren, müssen Sie die Metadaten der externen Tabelle einmal manuell mit ALTER EXTERNAL TABLE … REFRESH aktualisieren.
Standard:
TRUE
AUTO_REFRESH = TRUE | FALSE
Gibt an, ob Snowflake das Auslösen einer automatischen Aktualisierung der Metadaten der externen Tabelle aktivieren soll, wenn in dem in
[ WITH ] LOCATION =
angegebenen benannten externen Stagingbereich neue oder aktualisierte Datendateien verfügbar sind.Bemerkung
Das Einstellen dieses Parameters auf TRUE wird bei partitionierten externen Tabellen, deren Partitionen manuell vom Objekteigentümer hinzugefügt werden (d. h. wenn
PARTITION_TYPE = USER_SPECIFIED
), nicht unterstützt.Die Einstellung dieses Parameters auf TRUE wird nicht unterstützt, wenn die externen Tabellen auf Datendateien verweisen, die in einem S3-kompatiblen externen Stagingbereich gespeichert sind. Sie müssen die Metadaten manuell aktualisieren, indem Sie den Befehl ALTER EXTERNAL TABLE … REFRESH ausführen.
Sie müssen eine Ereignisbenachrichtigung für Ihren Speicherort konfigurieren, um Snowflake zu benachrichtigen, wenn neue oder aktualisierte Daten zum Einlesen in die Metadaten der externen Tabelle verfügbar sind. Weitere Informationen dazu finden Sie in der Anleitung Ihres Cloudspeicherdienstes:
- Google Cloud Storage:
Automatisches Aktualisieren externer Tabellen für Google Cloud Storage
- Microsoft Azure:
Automatisches Aktualisieren externer Tabellen für Azure Blob Storage
Wenn eine externe Tabelle erstellt wird, werden deren Metadaten automatisch einmal aktualisiert, es sei denn,
REFRESH_ON_CREATE = FALSE
.
TRUE
Snowflake ermöglicht das Auslösen automatischer Aktualisierungen von Metadaten externer Tabellen.
FALSE
Snowflake ermöglicht nicht das Auslösen automatischer Aktualisierungen von Metadaten externer Tabellen. Sie müssen die Metadaten der externen Tabellen manuell mit ALTER EXTERNAL TABLE … REFRESH aktualisieren, um die Metadaten mit der aktuellen Liste der Dateien im Stagingbereichspfad zu synchronisieren.
Standard:
TRUE
PATTERN = 'regex_pattern'
Eine Musterzeichenfolge mit regulären Ausdrücken, die in einfache Anführungszeichen eingeschlossen ist und die die Dateinamen und/oder Pfade zum externen Stagingbereich angibt, die übereinstimmen sollen.
Tipp
Um die beste Leistung zu erzielen, sollten Sie vermeiden, Muster anzuwenden, die eine große Anzahl von Dateien filtern.
AWS_SNS_TOPIC = 'string'
Nur erforderlich, wenn AUTO_REFRESH für Amazon S3-Stagingbereiche mit dem Amazon Simple Notification Service (SNS) konfiguriert wird. Gibt den Amazon-Ressourcennamen (ARN) für das SNS-Thema für Ihren S3-Bucket an. Mit der CREATE EXTERNAL TABLE-Anweisung wird die Warteschlange von Amazon Simple Queue Service (SQS) für das angegebene SNS-Thema abonniert. Ereignisbenachrichtigungen über das Thema SNS lösen Metadatenaktualisierungen aus. Weitere Informationen dazu finden Sie unter Automatisches Aktualisieren externer Tabellen für Amazon S3.
TABLE_FORMAT = DELTA
Kennzeichnet die externe Tabelle als Verweis auf einen Delta Lake am Cloudspeicherort. Ein Delta Lake wird auf Amazon S3, Google Cloud Storage oder Microsoft Azure-Cloudspeicher unterstützt.
Bemerkung
Dieses Vorschau-Feature ist für alle Konten verfügbar.
Wenn dieser Parameter gesetzt ist, sucht die externe Tabelle nach Delta Lake-Transaktionsprotokolldateien am
[ WITH ] LOCATION
-Speicherort. Delta-Protokolldateien haben Namen wie_delta_log/00000000000000000000.json
,_delta_log/00000000000000000010.checkpoint.parquet
usw.Wenn die Metadaten einer externen Tabelle aktualisiert werden, analysiert Snowflake die Delta Lake-Transaktionsprotokolle und ermittelt, welche Parquet-Dateien aktuell sind. Im Hintergrund werden im Zuge der Aktualisierung Operationen zum Hinzufügen und Entfernen von Dateien ausgeführt, um die Metadaten der externen Tabelle auf dem neuesten Stand zu halten.
Bemerkung
Der in
[ WITH ] LOCATION =
angegebene externe Stagingbereich und der optionale Pfad müssen die Datendateien und Metadaten für eine einzelne Delta Lake-Tabelle enthalten. Das heißt, der angegebene Speicherort kann nur ein__delta_log
-Verzeichnis enthalten.Die Reihenfolge der durch DDL-Operationen im Cloudspeicher ausgelösten Ereignisbenachrichtigungen ist nicht garantiert. Daher ist die Möglichkeit der automatischen Aktualisierung für externe Tabellen, die auf Delta Lake-Dateien verweisen, nicht verfügbar. Sowohl
REFRESH_ON_CREATE
als auchAUTO_REFRESH
müssen auf FALSE gesetzt werden.Führen Sie in regelmäßigen Abständen eine ALTER EXTERNAL TABLE … REFRESH-Anweisung aus, um alle hinzugefügten oder entfernten Dateien zu registrieren.
Der Wert von
FILE_FORMAT
muss Parquet als Dateityp angeben.Um eine optimale Leistung zu erzielen, sollten für die externe Tabelle Partitionsspalten definiert werden.
Die folgenden Parameter werden beim Referenzieren auf einen Delta Lake nicht unterstützt:
AWS_SNS_TOPIC = 'string'
PATTERN = 'regex_pattern'
COPY GRANTS
Gibt an, dass die Zugriffsberechtigungen der ursprünglichen Tabelle beibehalten werden, wenn mit der Variante CREATE OR REPLACE TABLE eine externe Tabelle neu erstellt wird. Der Parameter kopiert alle Berechtigungen, mit Ausnahme von OWNERSHIP, aus der bestehenden Tabelle in die neue Tabelle. Standardmäßig ist die Rolle, die den Befehl CREATE EXTERNAL TABLE ausführt, Eigentümer der neuen externen Tabelle.
Bemerkung
Die Operation zum Kopieren von Berechtigungen erfolgt atomar im Befehl CREATE EXTERNAL TABLE (d. h. innerhalb derselben Transaktion).
COMMENT = 'string_literal'
Zeichenfolge (Literal), die einen Kommentar zur externen Tabelle enthält.
Standard: Kein Wert
ROW ACCESS POLICY <policy_name> ON (VALUE)
Gibt die Zeilenzugriffsrichtlinie an, die für die Tabelle festgelegt werden soll.
Geben Sie die Spalte VALUE an, wenn Sie eine Zeilenzugriffsrichtlinie auf eine externe Tabelle anwenden.
TAG ( tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ] )
Gibt den Namen des Tags und den Wert der Tag-Zeichenfolge an.
Der Tag-Wert ist immer eine Zeichenfolge, die maximale 256 Zeichen lang sein kann.
Weitere Informationen zur Angabe von Tags in einer Anweisung finden Sie unter Tag-Kontingente für Objekte und Spalten.
Partitionierungsparameter¶
Verwenden Sie diese Parameter, um Ihre externe Tabelle zu partitionieren.
part_col_name col_type AS part_expr
Definiert eine oder mehrere Partitionsspalten in der externen Tabelle.
Das Format einer Partitionsspaltendefinition unterscheidet sich je nachdem, ob die Partitionen anhand eines Ausdrucks in jeder Partitionsspalte automatisch berechnet und hinzugefügt werden oder ob die Partitionen manuell hinzugefügt werden.
- Aus einem Ausdruck hinzugefügt:
Eine Partitionsspalte muss als Ausdruck ausgewertet werden, der die Pfad- und/oder Dateinamendaten in der Pseudospalte METADATA$FILENAME analysiert. Partitionsspalten optimieren die Abfrageleistung, indem sie jene Datendateien entfernen, die nicht gescannt werden müssen (d. h. Partitionierung der externen Tabelle). Eine Partition besteht aus allen Datendateien, die mit dem Pfad und/oder Dateinamen im Ausdruck für die Partitionsspalte übereinstimmen.
part_col_name
Zeichenfolge, die den Bezeichner der Partitionsspalte (d. h. den Namen) angibt. Alle Anforderungen an Tabellenbezeichner gelten auch für Spaltenbezeichner.
col_type
Zeichenfolge (Konstante), die den Datentyp für die Spalte angibt. Der Datentyp der Spalte muss mit dem Ergebnis von
part_expr
übereinstimmen.part_expr
Zeichenfolge, die den Ausdruck für die Spalte angibt. Der Ausdruck muss die Pseudospalte METADATA$FILENAME enthalten.
Externe Tabellen unterstützen in Partitionsausdrücken derzeit die folgende Teilmenge von Funktionen:
Liste der unterstützten Funktionen:
=
,<>
,>
,>=
,<
,<=
||
+
,-
-
(negieren)*
AND
,OR
NOT
- Manuell hinzugefügt:
Erforderlich: Setzen Sie auch den Wert des Parameters
PARTITION_TYPE
aufUSER_SPECIFIED
.Eine Partitionsspaltendefinition ist ein Ausdruck, der die Spaltenmetadaten in der internen (verborgenen) Spalte METADATA$EXTERNAL_TABLE_PARTITION analysiert. Im Wesentlichen definiert die Definition nur den Datentyp für die Spalte. Das Format der Partitionsspaltendefinition ist wie folgt:
part_col_name col_type AS ( PARSE_JSON (METADATA$EXTERNALTABLE_PARTITION):part_col_name::data_type )
Angenommen, die Spalten
col1
,col2
undcol3
enthalten Varchar-, Zahlen- bzw. Zeitstempel-Daten (Zeitzone):col1 varchar as (parse_json(metadata$external_table_partition):col1::varchar), col2 number as (parse_json(metadata$external_table_partition):col2::number), col3 timestamp_tz as (parse_json(metadata$external_table_partition):col3::timestamp_tz)
Identifizieren Sie nach dem Definieren von Partitionsspalten für die Tabelle diese Spalten mit der Klausel PARTITION BY.
Bemerkung
Die maximale Länge der Namen von benutzerdefinierten Partitionsspalten beträgt 32 Zeichen.
PARTITION_TYPE = USER_SPECIFIED
Definiert den Partitionstyp für die externe Tabelle als benutzerdefiniert. Der Eigentümer der externen Tabelle (d. h. die Rolle mit OWNERSHIP-Berechtigung für die externe Tabelle) muss Partitionen manuell mit der ALTER EXTERNAL TABLE … ADD PARTITION-Anweisungen zu den externen Metadaten hinzufügen.
Legen Sie diesen Parameter nicht fest, wenn bei Auswertung der Ausdrücke in den Partitionsspalten Partitionen automatisch zu den Metadaten der externen Tabelle hinzugefügt werden.
[ PARTITION BY ( part_col_name [, part_col_name ... ] ) ]
Gibt alle Partitionsspalten an, die für die externe Tabelle ausgewertet werden sollen.
- Verwendung:
Fügen Sie beim Abfragen einer externen Tabelle eine oder mehrere Partitionsspalten in eine WHERE-Klausel ein, z. B.:
... WHERE part_col_name = 'filter_value'
Snowflake-Filter auf den Partitionsspalten beschränken die Menge der zu scannenden Datendateien. Beachten Sie, dass alle Zeilen in diesen Dateien gescannt werden. Wenn eine WHERE-Klausel Spalten ohne Partition enthält, werden diese Filter ausgewertet, nachdem die Datendateien gefiltert wurden.
Es ist üblich, die Datendateien anhand von Zeitintervallen zu partitionieren, oder, wenn die Datendateien aus mehreren Quellen bereitgestellt werden, anhand eines Datenquellenbezeichners und eines Datums oder eines Zeitstempels zu partitionieren.
Cloudanbieterparameter (cloudProviderParams
)¶
Google Cloud Storage
INTEGRATION = integration_name
Gibt den Namen der Benachrichtigungsintegration an, mit der die Metadaten der externen Tabelle unter Verwendung von Google Pub/Sub-Ereignisbenachrichtigungen automatisch aktualisiert werden. Eine Benachrichtigungsintegration ist ein Snowflake-Objekt, das als Schnittstelle zwischen Snowflake und Cloud-Meldungswarteschlangendiensten von Drittanbietern dient.
Dieser Parameter ist erforderlich, um automatische Aktualisierungsvorgänge für die externe Tabelle zu aktivieren. Anweisungen zum Konfigurieren der automatischen Aktualisierungsfunktion finden Sie unter Automatisches Aktualisieren externer Tabellen für Google Cloud Storage.
Microsoft Azure
INTEGRATION = integration_name
Gibt den Namen der Benachrichtigungsintegration an, mit der die Metadaten der externen Tabelle unter Verwendung von Azure Event Grid-Benachrichtigungen automatisch aktualisiert werden. Eine Benachrichtigungsintegration ist ein Snowflake-Objekt, das als Schnittstelle zwischen Snowflake und Warteschlangendiensten von Drittanbietern dient.
Dieser Parameter ist erforderlich, um automatische Aktualisierungsvorgänge für die externe Tabelle zu aktivieren. Anweisungen zum Konfigurieren der automatischen Aktualisierungsfunktion finden Sie unter Automatisches Aktualisieren externer Tabellen für Azure Blob Storage.
Formattypoptionen (formatTypeOptions
)¶
Formattypoptionen werden zum Laden von Daten in und Entladen von Daten aus Tabellen verwendet.
Je nach angegebenem Dateiformattyp (FILE_FORMAT = ( TYPE = ... )
) können Sie eine oder mehrere der folgenden formatspezifischen Optionen (durch Leerzeichen, Kommas oder Neue-Zeile-Zeichen getrennt) einschließen:
TYPE = CSV¶
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
Zeichenfolge (Konstante), die den aktuellen Komprimierungsalgorithmus für die abzufragenden Datendateien angibt. Snowflake verwendet diese Option, um zu ermitteln, wie bereits komprimierte Datendateien komprimiert wurden, sodass die komprimierten Daten in den Dateien zum Abfragen extrahiert werden können.
Unterstützte Werte
Anmerkungen
AUTO
Der Komprimierungsalgorithmus wird automatisch erkannt, mit Ausnahme von Brotli-komprimierten Dateien, die derzeit nicht automatisch erkannt werden können. Wenn Sie Brotli-komprimierte Dateien abfragen, verwenden Sie explizit
BROTLI
anstelle vonAUTO
.GZIP
BZ2
BROTLI
Muss beim Abfragen von Brotli-komprimierten Dateien angegeben werden.
ZSTD
Zstandard v0.8 (und höher) wird unterstützt.
DEFLATE
Deflate-komprimierte Dateien (mit zlib-Header, RFC1950).
RAW_DEFLATE
Raw Deflate-komprimierte Dateien (ohne Header, RFC1951).
NONE
Die Datendateien wurden nicht komprimiert.
RECORD_DELIMITER = 'character' | NONE
Ein oder mehrere Zeichen, die Datensätze in einer Eingabedatei trennen. Akzeptiert gängige Escapesequenzen oder die folgenden Einzelbyte- oder Multibyte-Zeichen:
- Einzelbyte-Zeichen:
Oktalwerte (mit
\\
vorangestellt) oder Hexadezimalwerte (mit0x
oder\x
vorangestellt). Geben Sie beispielsweise für Datensätze, die durch das Zirkumflex-Akzentzeichen (^
) getrennt sind, den Oktalwert (\\136
) oder den Hexadezimalwert (0x5e
) an.- Multibyte-Zeichen:
Hexadezimalwerte (mit vorangestelltem
\x
). Geben Sie beispielsweise für Datensätze, die durch das Centzeichen (¢
) getrennt sind, den Hexadezimalwert (\xC2\xA2
) an.Das Trennzeichen für RECORD_DELIMITER oder FIELD_DELIMITER darf jedoch keine Teilzeichenfolge des Trennzeichens der anderen Dateiformatoption sein (z. B.
FIELD_DELIMITER = 'aa' RECORD_DELIMITER = 'aabb'
).
Das angegebene Trennzeichen muss ein gültiges UTF-8-Zeichen sein und darf keine zufällige Sequenz von Bytes sein. Beachten Sie auch, dass das Trennzeichen nur maximal 20 Zeichen lang sein darf.
Akzeptiert auch den Wert
NONE
.Standard: Neue-Zeile-Zeichen. Beachten Sie, dass „neue Zeile“ logisch ist, sodass
\r\n
als neue Zeile für Dateien auf einer Windows-Plattform verstanden wird.FIELD_DELIMITER = 'character' | NONE
Ein oder mehrere Einzelbyte- oder Multibyte-Zeichen, die Felder in einer Eingabedatei voneinander trennen. Akzeptiert gängige Escapesequenzen oder die folgenden Einzelbyte- oder Multibyte-Zeichen:
- Einzelbyte-Zeichen:
Oktalwerte (mit
\\
vorangestellt) oder Hexadezimalwerte (mit0x
oder\x
vorangestellt). Geben Sie beispielsweise für Datensätze, die durch das Zirkumflex-Akzentzeichen (^
) getrennt sind, den Oktalwert (\\136
) oder den Hexadezimalwert (0x5e
) an.- Multibyte-Zeichen:
Hexadezimalwerte (mit vorangestelltem
\x
). Geben Sie beispielsweise für Datensätze, die durch das Centzeichen (¢
) getrennt sind, den Hexadezimalwert (\xC2\xA2
) an.Das Trennzeichen für RECORD_DELIMITER oder FIELD_DELIMITER darf jedoch keine Teilzeichenfolge des Trennzeichens der anderen Dateiformatoption sein (z. B.
FIELD_DELIMITER = 'aa' RECORD_DELIMITER = 'aabb'
).Bemerkung
Für Nicht-ASCII-Zeichen müssen Sie den Hex-Byte-Sequenzwert verwenden, um ein deterministisches Verhalten zu erreichen.
Das angegebene Trennzeichen muss ein gültiges UTF-8-Zeichen sein und darf keine zufällige Sequenz von Bytes sein. Beachten Sie auch, dass das Trennzeichen nur maximal 20 Zeichen lang sein darf.
Akzeptiert auch den Wert
NONE
.Standard: Komma (
,
)SKIP_HEADER = integer
Anzahl der Zeilen am Anfang der zu überspringenden Datei.
Beachten Sie, dass SKIP_HEADER nicht die Werte RECORD_DELIMITER oder FIELD_DELIMITER verwendet, um zu bestimmen, was eine Kopfzeile ist. Stattdessen wird einfach die angegebene Anzahl von CRLF (Wagenrücklauf, Zeilenvorschub)-begrenzten Zeilen in der Datei übersprungen. RECORD_DELIMITER und FIELD_DELIMITER werden dann verwendet, um die abzufragenden Datenzeilen zu bestimmen.
Standard:
0
SKIP_BLANK_LINES = TRUE | FALSE
- Verwendung:
Nur Datenabfragen
- Definition:
Boolescher Wert, der angibt, ob Leerzeilen in den Datendateien übersprungen werden sollen oder ob sie zu einem Datensatzende-Fehler (Standardverhalten) führen.
Standard:
FALSE
ESCAPE_UNENCLOSED_FIELD = 'character' | NONE
Zeichenfolge mit Einzelbyte-Zeichen, das als Escapezeichen nur für nicht eingeschlossene Feldwerte verwendet wird. Ein Escapezeichen ruft eine alternative Interpretation für nachfolgende Zeichen in einer Sequenz von Zeichen auf. Sie können das ESCAPE-Zeichen verwenden, um Instanzen von
FIELD_DELIMITER
- oderRECORD_DELIMITER
-Zeichen in den Daten als Literale zu interpretieren. Das Escapezeichen kann auch verwendet werden, um Instanzen von sich selbst in den Daten in Escapezeichen einzuschließen.Akzeptiert gängige Escapesequenzen, Oktalwerte oder Hexadezimalwerte.
Gibt nur das Escapezeichen für nicht eingeschlossene Felder an.
Bemerkung
Der Standardwert ist
\\
. Wenn eine Zeile in einer Datendatei mit dem umgekehrten Schrägstrich (\
) endet, wird das für die DateiformatoptionRECORD_DELIMITER
angegebene Zeilenumbruch- oder Wagenrücklaufzeichen durch dieses Zeichen ersetzt. Infolgedessen werden diese und die nächste Zeile als eine Datenzeile behandelt. Um dieses Problem zu vermeiden, setzen Sie diesen Wert aufNONE
.Diese Dateiformatoption unterstützt nur Einzelbyte-Zeichen. Beachten Sie, dass die UTF-8-Zeichencodierung höherwertige ASCII-Zeichen als Multibyte-Zeichen darstellt. Wenn Ihre Datendatei mit dem UTF-8-Zeichensatz kodiert ist, können Sie keine höherwertigen ASCII-Zeichen als Optionswert angeben.
Wenn Sie ein höherwertiges Zeichen (ASCII) angeben, empfehlen wir Ihnen außerdem, die Dateiformatoption
ENCODING = 'string'
als Zeichencodierung für Ihre Datendateien festzulegen, damit das Zeichen korrekt interpretiert wird.
Standard: Backslash (
\\
)TRIM_SPACE = TRUE | FALSE
Boolescher Wert, der angibt, ob Leerzeichen aus Feldern entfernt werden sollen.
Wenn Ihre externe Datenbanksoftware beispielsweise Felder in Anführungszeichen setzt, aber ein führendes Leerzeichen einfügt, liest Snowflake das führende Leerzeichen und nicht das öffnende Anführungszeichen als Anfang des Feldes (d. h. die Anführungszeichen werden als Teil der Zeichenfolge von Felddaten interpretiert). Setzen Sie diese Option auf
TRUE
, um beim Abfragen von Daten unerwünschte Leerzeichen zu entfernen.Weiteres Beispiel: Wenn Zeichenfolgen von Anführungszeichen umschlossen sind und die Anführungszeichen von führenden oder nachstehende Leerzeichen, können Sie die umgebenden Leerzeichen mit dieser Option entfernen und die Anführungszeichen mit der Option
FIELD_OPTIONALLY_ENCLOSED_BY
. Beachten Sie, dass alle innerhalb der Anführungszeichen befindlichen Leerzeichen erhalten bleiben. Zum Beispiel beiFIELD_DELIMITER = '|'
undFIELD_OPTIONALLY_ENCLOSED_BY = '"'
:|"Hello world"| /* returned as */ >Hello world< |" Hello world "| /* returned as */ > Hello world < | "Hello world" | /* returned as */ >Hello world<
Beachten Sie, dass die Klammern in diesem Beispiel nicht zurückgegeben werden. Sie dienen lediglich dazu, den Anfang und das Ende der geladenen Zeichenfolgen zu markieren.
Standard:
FALSE
FIELD_OPTIONALLY_ENCLOSED_BY = 'character' | NONE
Zeichen, das verwendet wird, um Zeichenfolgen einzuschließen. Der Wert kann
NONE
, ein einfaches Anführungszeichen ('
) oder ein doppeltes Anführungszeichen ("
) sein. Um das einfache Anführungszeichen verwenden zu können, müssen Sie die oktale oder hexadezimale Darstellung (0x27
) oder das doppelte einfache Anführungszeichen als Escape-Zeichen (''
) verwenden.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 "B" C
enthält, schließen Sie die doppelten Anführungszeichen in Escapezeichen ein:A ""B"" C
Standard:
NONE
NULL_IF = ( 'string1' [ , 'string2' , ... ] )
Zeichenfolge, die zum Konvertieren in und von SQL NULL verwendet wird:
Beim Abfragen von Daten ersetzt Snowflake diese Werte in den zurückgegebenen Daten durch SQL NULL. Um mehr als eine Zeichenfolge anzugeben, schließen Sie die Liste der Zeichenfolgen in Klammern ein und trennen Sie jeden Wert durch Kommas.
Beachten Sie, dass Snowflake alle Instanzen des Wertes in einen NULL-Wert konvertiert, unabhängig vom Datentyp. Wenn z. B.
2
als Wert angegeben wird, werden alle Instanzen von2
entweder in eine Zeichenfolge oder in eine Zahl konvertiert.Beispiel:
NULL_IF = ('N', 'NULL', 'NUL', '')
Beachten Sie, dass diese Option leere Zeichenfolgen enthalten kann.
Standard:
\\N
(d. h. NULL mit der Annahme, dass derESCAPE_UNENCLOSED_FIELD
-Wert\\
ist)EMPTY_FIELD_AS_NULL = TRUE | FALSE
Gibt an, ob für leere Felder einer Eingabedatei, die durch zwei aufeinanderfolgende Trennzeichen (z. B.
,,
) repräsentiert werden, SQL NULL zurückgegeben werden soll.Wenn der Wert
FALSE
ist, versucht Snowflake, ein leeres Feld in den entsprechenden Spaltentyp umzuwandeln. Für Spalten des Typs STRING wird eine leere Zeichenfolge zurückgegeben. Bei anderen Spaltentypen gibt die Abfrage einen Fehler zurück.Standard:
TRUE
ENCODING = 'string'
Zeichenfolge (Konstante), die bei der Datenabfrage den Zeichensatz der Quelldaten angibt.
Zeichensatz
ENCODING
-WertUnterstützte Sprachen
Anmerkungen
Big5
BIG5
Traditionelles Chinesisch
EUC-JP
EUCJP
Japanisch
EUC-KR
EUCKR
Koreanisch
GB18030
GB18030
Chinesisch
IBM420
IBM420
Arabisch
IBM424
IBM424
Hebräisch
IBM949
IBM949
Koreanisch
ISO-2022-CN
ISO2022CN
Vereinfachtes Chinesisch
ISO-2022-JP
ISO2022JP
Japanisch
ISO-2022-KR
ISO2022KR
Koreanisch
ISO-8859-1
ISO88591
Dänisch, Deutsch, Englisch, Französisch, Italienisch, Niederländisch, Norwegisch, Portugiesisch, Schwedisch
ISO-8859-2
ISO88592
Polnisch, Rumänisch, Tschechisch, Ungarisch
ISO-8859-5
ISO88595
Russisch
ISO-8859-6
ISO88596
Arabisch
ISO-8859-7
ISO88597
Griechisch
ISO-8859-8
ISO88598
Hebräisch
ISO-8859-9
ISO88599
Türkisch
ISO-8859-15
ISO885915
Dänisch, Deutsch, Englisch, Französisch, Italienisch, Niederländisch, Norwegisch, Portugiesisch, Schwedisch
Identisch mit ISO-8859-1, bis auf 8 Zeichen, zu denen auch das Euro-Währungssymbol gehört.
KOI8-R
KOI8R
Russisch
Shift_JIS
SHIFTJIS
Japanisch
UTF-8
UTF8
Alle Sprachen
Zum Laden von Daten aus Dateien mit Trennzeichen (CSV, TSV usw.) ist UTF-8 die Standardeinstellung. . . Beim Laden von Daten aus allen anderen unterstützten Dateiformaten (JSON, Avro usw.) sowie zum Entladen von Daten ist UTF-8 der einzige unterstützte Zeichensatz.
UTF-16
UTF16
Alle Sprachen
UTF-16BE
UTF16BE
Alle Sprachen
UTF-16LE
UTF16LE
Alle Sprachen
UTF-32
UTF32
Alle Sprachen
UTF-32BE
UTF32BE
Alle Sprachen
UTF-32LE
UTF32LE
Alle Sprachen
windows-949
WINDOWS949
Koreanisch
windows-1250
WINDOWS1250
Polnisch, Rumänisch, Tschechisch, Ungarisch
windows-1251
WINDOWS1251
Russisch
windows-1252
WINDOWS1252
Dänisch, Deutsch, Englisch, Französisch, Italienisch, Niederländisch, Norwegisch, Portugiesisch, Schwedisch
windows-1253
WINDOWS1253
Griechisch
windows-1254
WINDOWS1254
Türkisch
windows-1255
WINDOWS1255
Hebräisch
windows-1256
WINDOWS1256
Arabisch
Standard:
UTF8
Bemerkung
Snowflake speichert alle Daten intern im UTF-8-Zeichensatz. Die Daten werden in UTF-8 umgewandelt.
TYPE = JSON¶
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
Zeichenfolge (Konstante), die den aktuellen Komprimierungsalgorithmus für die zurückzugebenden Datendateien angibt. Snowflake verwendet diese Option, um zu ermitteln, wie bereits komprimierte Datendateien komprimiert wurden, sodass die komprimierten Daten in den Dateien zum Abfragen extrahiert werden können.
Unterstützte Werte
Anmerkungen
AUTO
Der Komprimierungsalgorithmus wird automatisch erkannt, mit Ausnahme von Brotli-komprimierten Dateien, die derzeit nicht automatisch erkannt werden können. Wenn Sie Brotli-komprimierte Dateien abfragen, verwenden Sie explizit
BROTLI
anstelle vonAUTO
.GZIP
BZ2
BROTLI
ZSTD
DEFLATE
Deflate-komprimierte Dateien (mit zlib-Header, RFC1950).
RAW_DEFLATE
Raw Deflate-komprimierte Dateien (ohne Header, RFC1951).
NONE
Zeigt an, dass die Dateien nicht komprimiert wurden.
Standard:
AUTO
ALLOW_DUPLICATE = TRUE | FALSE
Boolescher Wert, der angibt, dass doppelte Objektfeldnamen erlaubt sind (nur der letzte wird beibehalten).
Standard:
FALSE
STRIP_OUTER_ARRAY = TRUE | FALSE
Boolescher Wert, der den JSON-Parser anweist, die äußeren Klammern zu entfernen (d. h.
[ ]
).Standard:
FALSE
STRIP_NULL_VALUES = TRUE | FALSE
Boolescher Wert, der den JSON-Parser anweist, Objektfelder oder Array-Elemente mit
null
-Werten zu entfernen. Zum Beispiel, wenn aufTRUE
gesetzt:Vorher
Nachher
[null]
[]
[null,null,3]
[,,3]
{"a":null,"b":null,"c":123}
{"c":123}
{"a":[1,null,2],"b":{"x":null,"y":88}}
{"a":[1,,2],"b":{"y":88}}
Standard:
FALSE
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
Boolescher Wert, der angibt, ob ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen ersetzt werden sollen (
�
). Diese Option führt eine 1:1-Zeichenersetzung aus.Bei Einstellung auf
TRUE
ersetzt Snowflake ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen.Bei Einstellung auf
FALSE
gibt die Ladeoperation einen Fehler aus, wenn eine ungültige UTF-8-Zeichencodierung erkannt wird.Standard:
FALSE
TYPE = AVRO¶
COMPRESSION = AUTO | GZIP | BZ2 | BROTLI | ZSTD | DEFLATE | RAW_DEFLATE | NONE
Zeichenfolge (Konstante), die den aktuellen Komprimierungsalgorithmus für die abzufragenden Datendateien angibt. Snowflake verwendet diese Option, um zu ermitteln, wie bereits komprimierte Datendateien komprimiert wurden, sodass die komprimierten Daten in den Dateien zum Abfragen extrahiert werden können.
Unterstützte Werte
Anmerkungen
AUTO
Der Komprimierungsalgorithmus wird automatisch erkannt, mit Ausnahme von Brotli-komprimierten Dateien, die derzeit nicht automatisch erkannt werden können. Wenn Sie Brotli-komprimierte Dateien abfragen, verwenden Sie explizit
BROTLI
anstelle vonAUTO
.GZIP
BZ2
BROTLI
ZSTD
DEFLATE
Deflate-komprimierte Dateien (mit zlib-Header, RFC1950).
RAW_DEFLATE
Raw Deflate-komprimierte Dateien (ohne Header, RFC1951).
NONE
Die abzufragenden Datendateien wurden nicht komprimiert.
Standard:
AUTO
.
Bemerkung
Wir empfehlen die Verwendung der Standardoption AUTO
, da mit dieser sowohl die Datei- als auch die Codec-Komprimierung bestimmt wird. Die Angabe einer Komprimierungsoption bezieht sich auf die Komprimierung von Dateien, nicht auf die Komprimierung von Blöcken (Codecs).
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
Boolescher Wert, der angibt, ob ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen ersetzt werden sollen (
�
). Diese Option führt eine 1:1-Zeichenersetzung aus.Bei Einstellung auf
TRUE
ersetzt Snowflake ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen.Bei Einstellung auf
FALSE
gibt die Ladeoperation einen Fehler aus, wenn eine ungültige UTF-8-Zeichencodierung erkannt wird.Standard:
FALSE
TYPE = ORC¶
TRIM_SPACE = TRUE | FALSE
Boolescher Wert, der angibt, ob vorangestellte und nachstehende Leerzeichen aus Zeichenfolgen entfernt werden sollen.
Wenn Ihre externe Datenbanksoftware beispielsweise Felder in Anführungszeichen setzt, aber ein führendes Leerzeichen einfügt, liest Snowflake das führende Leerzeichen und nicht das öffnende Anführungszeichen als Anfang des Feldes (d. h. die Anführungszeichen werden als Teil der Zeichenfolge von Felddaten interpretiert). Setzen Sie diese Option auf
TRUE
, um unerwünschte Leerzeichen zu entfernen.Diese Dateiformatoption wird nur bei folgenden Aktionen angewendet:
Abfragen von Objektwerten in ORC-Datendateien in Stagingbereichen.
Abfragen von ORC-Daten in separaten Spalten unter Verwendung der Kopieroption MATCH_BY_COLUMN_NAME.
Abfragen von ORC-Daten in separate Spalten durch Angabe einer Abfrage in der COPY-Anweisung (d. h. COPY-Transformation).
Standard:
FALSE
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
Boolescher Wert, der angibt, ob ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen ersetzt werden sollen (
�
). Diese Option führt eine 1:1-Zeichenersetzung aus.Bei Einstellung auf
TRUE
ersetzt Snowflake ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen.Bei Einstellung auf
FALSE
gibt die Ladeoperation einen Fehler aus, wenn eine ungültige UTF-8-Zeichencodierung erkannt wird.Standard:
FALSE
NULL_IF = ( 'string1' [ , 'string2' , ... ] )
Zeichenfolge, die zum Konvertieren in und von SQL NULL verwendet wird. Snowflake ersetzt diese Zeichenfolgen in der Datenquelle durch SQL NULL. Um mehr als eine Zeichenfolge anzugeben, schließen Sie die Liste der Zeichenfolgen in Klammern ein und trennen Sie jeden Wert durch Kommas.
Beachten Sie, dass Snowflake alle Instanzen des Wertes in einen NULL-Wert konvertiert, unabhängig vom Datentyp. Wenn z. B.
2
als Wert angegeben wird, werden alle Instanzen von2
entweder in eine Zeichenfolge oder in eine Zahl konvertiert.Beispiel:
NULL_IF = ('N', 'NULL', 'NUL', '')
Beachten Sie, dass diese Option leere Zeichenfolgen enthalten kann.
Diese Dateiformatoption wird bei der Abfrage von Objektwerten in ORC-Datendateien in Stagingbereichen angewendet.
Standard:
\\N
(d. h. NULL mit der Annahme, dass derESCAPE_UNENCLOSED_FIELD
-Wert\\
ist)
TYPE = PARQUET¶
COMPRESSION = AUTO | SNAPPY | NONE
Zeichenfolge (Konstante), die den aktuellen Komprimierungsalgorithmus für Spalten der Parquet-Dateien angibt.
Unterstützte Werte
Anmerkungen
AUTO
Komprimierungsalgorithmus automatisch erkannt. Unterstützt die folgenden Komprimierungsalgorithmen: Brotli, gzip, Lempel-Ziv-Oberhumer (LZO), LZ4, Snappy und Zstandard v0.8 (und höher).
SNAPPY
NONE
Die Datendateien wurden nicht komprimiert.
Standard:
AUTO
BINARY_AS_TEXT = TRUE | FALSE
Boolescher Wert, der angibt, ob Spalten ohne definierten logischen Datentyp als UTF-8-Text interpretiert werden sollen. Wenn auf
FALSE
gesetzt, interpretiert Snowflake diese Spalten als Binärdaten.Standard:
TRUE
Bemerkung
Snowflake empfiehlt, BINARY_AS_TEXT auf FALSE zu setzen, um mögliche Konvertierungsprobleme zu vermeiden.
REPLACE_INVALID_CHARACTERS = TRUE | FALSE
Boolescher Wert, der angibt, ob ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen ersetzt werden sollen (
�
). Diese Option führt eine 1:1-Zeichenersetzung aus.Bei Einstellung auf
TRUE
ersetzt Snowflake ungültige UTF-8-Zeichen durch das Unicode-Ersetzungszeichen.Bei Einstellung auf
FALSE
gibt die Ladeoperation einen Fehler aus, wenn eine ungültige UTF-8-Zeichencodierung erkannt wird.Standard:
FALSE
Anforderungen an die Zugriffssteuerung¶
Eine Rolle, die zur Ausführung dieses SQL-Befehls verwendet wird, muss mindestens die folgenden Berechtigungen haben:
Berechtigung |
Objekt |
Anmerkungen |
---|---|---|
CREATE EXTERNAL TABLE |
Schema |
|
CREATE STAGE |
Schema |
Erforderlich, wenn ein neuer Stagingbereich erstellt wird. |
USAGE |
Stagingbereich |
Erforderlich, wenn auf einen vorhandenen Stagingbereich verwiesen wird. |
USAGE |
Dateiformat |
Beachten Sie, dass für die Bearbeitung eines Objekts in einem Schema auch die Berechtigung USAGE für die übergeordnete Datenbank und das Schema erforderlich ist.
Eine Anleitung zum Erstellen einer kundenspezifischen Rolle mit einer bestimmten Gruppe von Berechtigungen finden Sie unter Erstellen von kundenspezifischen Rollen.
Allgemeine Informationen zu Rollen und Berechtigungen zur Durchführung von SQL-Aktionen auf sicherungsfähigen Objekten finden Sie unter Übersicht zur Zugriffssteuerung.
Nutzungshinweise¶
Externe Tabellen unterstützen nur externe (d. h. S3, Azure oder GCS) Stagingbereiche. Interne (d. h. Snowflake) Stagingbereiche werden nicht unterstützt.
Sie können nicht auf Daten in archivierten Cloudspeicherklassen zugreifen, die erst wiederhergestellt werden müssen, bevor sie abgerufen werden können. Zu diesen Archivspeicherklassen gehören zum Beispiel die Amazon S3-Speicherklassen Glacier Flexible Retrieval und Glacier Deep Archive oder Microsoft Azure Archive Storage.
Snowflake setzt keine Integritätseinschränkungen für externe Tabellen durch. Insbesondere erzwingt Snowflake, anders als normale Tabellen, keine NOT NULL-Einschränkungen.
Externe Tabellen enthalten die folgende Metadatenspalte:
METADATA$FILENAME: Name der einzelnen in der externen Tabelle enthaltenen Staging-Datendateien. Enthält den Pfad zur Datendatei im Stagingbereich.
METADATA$FILE_ROW_NUMBER: Zeilenzahl für jeden Datensatz in der Staging-Datendatei.
Folgendes wird bei externen Tabellen nicht unterstützt:
Gruppierungsschlüssel
Klonen
Daten im XML-Format
Time Travel wird bei externen Tabellen nicht unterstützt.
Weitere Informationen zur Verwendung einer externen Tabelle mit einer Richtlinie finden Sie unter:
Die Verwendung von
OR REPLACE
ist gleichbedeutend mit der Ausführung von DROP EXTERNAL TABLE auf der vorhandenen externen Tabelle und der anschließenden Erstellung einer neuen externen Tabelle mit demselben Namen.CREATE OR REPLACE <Objekt>-Anweisungen sind atomar. Das heißt, wenn ein Objekt ersetzt wird, erfolgt das Löschen des alten Objekts und das Erstellen des neuen Objekts in einer einzigen Transaktion.
Das bedeutet, dass alle Abfragen, die gleichzeitig mit der Operation CREATE OR REPLACE EXTERNAL TABLE ausgeführt werden, entweder die alte oder die neue Version der externen Tabelle verwenden.
Metadaten:
Achtung
Kunden müssen sicherstellen, dass bei der Nutzung des Snowflake-Dienstes keine personenbezogenen Daten (außer für ein Objekt „Benutzer“), sensible Daten, exportkontrollierte Daten oder andere regulierte Daten als Metadaten eingegeben werden. Weitere Informationen dazu finden Sie unter Metadatenfelder in Snowflake.
Wenn Sie eine externe Tabelle mit einer zur externen Tabelle hinzugefügten Zeilenzugriffsrichtlinie erstellen, verwenden Sie die Funktion POLICY_CONTEXT, um eine Abfrage auf die externe Tabelle zu simulieren, die durch eine Zeilenzugriffsrichtlinie geschützt ist.
SELECT
*
gibt immer die Spalte VALUE zurück, in der alle regulären oder semistrukturierten Daten in Variant-Zeile umgewandelt werden.
Beispiele¶
Automatisch aus Partitionsspaltenausdrücken hinzugefügte Partitionen¶
Erstellen Sie eine externe Tabelle mit Partitionen, die aus Ausdrücken in den Partitionsspaltendefinitionen berechnet werden.
Im folgenden Beispiel sind die Datendateien im Cloudspeicher anhand der folgenden Struktur organisiert: logs/YYYY/MM/DD/HH24
. Beispiel:
logs/2018/08/05/0524/
logs/2018/08/27/1408/
Erstellen Sie einen externen Stagingbereich mit dem Namen
s1
für den Speicherort, an dem die Datendateien gespeichert sind. Weitere Informationen dazu finden Sie unter CREATE STAGE.Die Stagingbereichsdefinition enthält den Pfad
/files/logs/
:Amazon S3
CREATE STAGE s1 URL='s3://mybucket/files/logs/' ... ;
Google Cloud Storage
CREATE STAGE s1 URL='gcs://mybucket/files/logs/' ... ;
Microsoft Azure
CREATE STAGE s1 URL='azure://mycontainer/files/logs/' ... ;
Fragen Sie die Pseudospalte METADATA$FILENAME in den bereitgestellten Daten ab. Verwenden Sie die Ergebnisse, um Ihre Partitionsspalten zu entwickeln:
SELECT metadata$filename FROM @s1/; +----------------------------------------+ | METADATA$FILENAME | |----------------------------------------| | files/logs/2018/08/05/0524/log.parquet | | files/logs/2018/08/27/1408/log.parquet | +----------------------------------------+
Erstellen Sie die partitionierte externe Tabelle.
In der Partitionsspalte
date_part
wirdYYYY/MM/DD
in der Pseudospalte METADATA$FILENAME unter Verwendung von TO_DATE , DATE in ein Datum umgewandelt: Im SQL-Befehl wird auch Parquet als Dateiformattyp angegeben.Die externen Tabellen für Amazon S3 und Microsoft Azure-Cloudspeicher enthalten den Parameter, der erforderlich ist, um die Metadaten automatisch zu aktualisieren, wenn dies durch Ereignisbenachrichtigungen vom jeweiligen Cloudmessagingdienst ausgelöst wird:
Amazon S3
CREATE EXTERNAL TABLE et1( date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3) || '/' || SPLIT_PART(metadata$filename, '/', 4) || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'), timestamp bigint AS (value:timestamp::bigint), col2 varchar AS (value:col2::varchar)) PARTITION BY (date_part) LOCATION=@s1/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET) AWS_SNS_TOPIC = 'arn:aws:sns:us-west-2:001234567890:s3_mybucket';
Google Cloud Storage
CREATE EXTERNAL TABLE et1( date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3) || '/' || SPLIT_PART(metadata$filename, '/', 4) || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'), timestamp bigint AS (value:timestamp::bigint), col2 varchar AS (value:col2::varchar)) PARTITION BY (date_part) LOCATION=@s1/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET);
Microsoft Azure
CREATE EXTERNAL TABLE et1( date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3) || '/' || SPLIT_PART(metadata$filename, '/', 4) || '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'), timestamp bigint AS (value:timestamp::bigint), col2 varchar AS (value:col2::varchar)) PARTITION BY (date_part) INTEGRATION = 'MY_INT' LOCATION=@s1/logs/ AUTO_REFRESH = true FILE_FORMAT = (TYPE = PARQUET);
Aktualisieren der Metadaten der externen Tabelle:
ALTER EXTERNAL TABLE et1 REFRESH;
Filtern Sie beim Abfragen der externen Tabelle die Daten anhand der Partitionsspalte mit einer WHERE-Klausel: Snowflake durchsucht nur die Dateien in den angegebenen Partitionen, die mit den Filterbedingungen übereinstimmen:
SELECT timestamp, col2 FROM et1 WHERE date_part = to_date('08/05/2018');
Manuell hinzugefügte Partitionen¶
Erstellen Sie eine externe Tabelle mit benutzerdefinierten Partitionen (d. h. die Partitionen werden vom Eigentümer der externen Tabelle manuell hinzugefügt).
Erstellen Sie einen externen Stagingbereich mit dem Namen
s2
für den Speicherort, an dem die Datendateien gespeichert sind.Die Stagingbereichsdefinition enthält den Pfad
/files/logs/
:Amazon S3
CREATE STAGE s2 URL='s3://mybucket/files/logs/' ... ;
Google Cloud Storage
CREATE STAGE s2 URL='gcs://mybucket/files/logs/' ... ;
Microsoft Azure
CREATE STAGE s2 URL='azure://mycontainer/files/logs/' ... ;
Erstellen Sie die partitionierte externe Tabelle. Die externe Tabelle enthält drei Partitionsspalten mit unterschiedlichen Datentypen.
Beachten Sie, dass bei den Spaltennamen in den Partitionsausdrücken die Groß-/Kleinschreibung beachtet wird. Es gelten die folgenden Regeln:
Der Name einer Partitionsspalte muss in Großbuchstaben geschrieben werden, es sei denn, der Spaltenname ist in Anführungszeichen eingeschlossen. Alternativ können Sie im SQL-Ausdruck auch GET_IGNORE_CASE anstelle des
:
-Zeichens verwenden, bei dem Groß-/Kleinschreibung relevant ist.Wenn ein Spaltenname in doppelte Anführungszeichen eingeschlossen ist (z. B. „Column1“), muss der Name der Partitionsspalte ebenfalls in Anführungszeichen gesetzt werden und genau mit dem Spaltennamen übereinstimmen.
Beachten Sie, dass die Syntax für jeden der drei Cloudspeicherdienste (Amazon S3, Google Cloud Storage und Microsoft Azure) identisch ist, da die Metadaten der externen Tabelle nicht aktualisiert werden:
create external table et2( col1 date as (parse_json(metadata$external_table_partition):COL1::date), col2 varchar as (parse_json(metadata$external_table_partition):COL2::varchar), col3 number as (parse_json(metadata$external_table_partition):COL3::number)) partition by (col1,col2,col3) location=@s2/logs/ partition_type = user_specified file_format = (type = parquet);
Fügen Sie Partitionen für die Partitionsspalten hinzu:
ALTER EXTERNAL TABLE et2 ADD PARTITION(col1='2022-01-24', col2='a', col3='12') LOCATION '2022/01';
Snowflake fügt die Partitionen zu den Metadaten der externen Tabelle hinzu. Bei dieser Operation werden auch alle neuen Datendateien am angegebenen Speicherort zu den Metadaten hinzugefügt:
+---------------------------------------+----------------+-------------------------------+ | file | status | description | +---------------------------------------+----------------+-------------------------------+ | mycontainer/files/logs/2022/01/24.csv | REGISTERED_NEW | File registered successfully. | | mycontainer/files/logs/2022/01/25.csv | REGISTERED_NEW | File registered successfully. | +---------------------------------------+----------------+-------------------------------+
Filtern Sie beim Abfragen der externen Tabelle die Daten anhand der Partitionsspalten mit einer WHERE-Klausel. In diesem Beispiel werden die Datensätze in der Reihenfolge zurückgegeben, in der sie in der Staging-Datendatei gespeichert sind:
SELECT col1, col2, col3 FROM et1 WHERE col1 = TO_DATE('2022-01-24') AND col2 = 'a' ORDER BY METADATA$FILE_ROW_NUMBER;
Externe Tabelle, die auf Dateien in einem Delta Lake verweist¶
Erstellen Sie eine partitionierte externe Tabelle mit dem Namen ext_twitter_feed
, die auf die Delta Lake-Dateien im Parquet-Format im externen Stagingbereich mystage
und im Pfad daily
verweist.
In der Partitionsspalte date_part
wird YYYY/MM/DD
in der Pseudospalte METADATA$FILENAME unter Verwendung von TO_DATE , DATE in ein Datum umgewandelt:
CREATE EXTERNAL TABLE ext_twitter_feed(
date_part date AS TO_DATE(SPLIT_PART(metadata$filename, '/', 3)
|| '/' || SPLIT_PART(metadata$filename, '/', 4)
|| '/' || SPLIT_PART(metadata$filename, '/', 5), 'YYYY/MM/DD'),
timestamp bigint AS (value:timestamp::bigint),
col2 varchar AS (value:col2::varchar))
PARTITION BY (date_part)
LOCATION=@mystage/daily/
REFRESH_ON_CREATE = FALSE
AUTO_REFRESH = FALSE
FILE_FORMAT = (TYPE = PARQUET)
TABLE_FORMAT = DELTA;
Materialisierte Ansicht für eine externe Tabelle¶
Erstellen Sie eine materialisierte Ansicht basierend auf einer Unterabfrage der Spalten in der externen Tabelle, die im Beispiel Automatisch aus Partitionsspaltenausdrücken hinzugefügte Partitionen erstellt wurde:
CREATE MATERIALIZED VIEW et1_mv
AS
SELECT col2 FROM et1;
Die allgemeine Syntax sowie Verwendungshinweise und weitere Beispiele für diesen SQL-Befehl finden Sie unter CREATE MATERIALIZED VIEW.
Externe Tabelle, die mit erkannten Spaltendefinitionen erstellt wird¶
Erstellen Sie eine externe Tabelle, bei der die Spaltendefinitionen von einer Menge von Stagingdateien abgeleitet sind, die Avro-, Parquet- oder ORC-Daten enthalten.
Beachten Sie, dass der Stagingbereich mystage
und das Dateiformat my_parquet_format
, auf die in der Anweisung verwiesen wird, bereits vorhanden sein müssen. Ein Satz von Dateien muss bereits in dem Stagingbereich an dem Cloudspeicherort bereitgestellt sein, auf den in der Stagingbereichsdefinition verwiesen wird.
Das folgende Beispiel baut auf einem Beispiel aus dem Thema INFER_SCHEMA auf:
CREATE EXTERNAL TABLE mytable USING TEMPLATE ( SELECT ARRAY_AGG(OBJECT_CONSTRUCT(*)) FROM TABLE( INFER_SCHEMA( LOCATION=>'@mystage', FILE_FORMAT=>'my_parquet_format' ) ) ) LOCATION=@mystage FILE_FORMAT=my_parquet_format AUTO_REFRESH=false;
Die Verwendung von *
für ARRAY_AGG(OBJECT_CONSTRUCT())
kann zu einem Fehler führen, wenn das zurückgegebene Ergebnis größer als 16 MB ist. Vermeiden Sie die Verwendung von *
bei größeren Resultsets, und verwenden Sie für die Abfrage nur die erforderlichen Spalten COLUMN NAME
, TYPE
und NULLABLE
, wie im folgenden Beispiel gezeigt. Die optionale Spalte ORDER_ID
kann bei Verwendung von WITHIN GROUP (ORDER BY order_id)
hinzugefügt werden.
CREATE EXTERNAL TABLE mytable USING TEMPLATE ( SELECT ARRAY_AGG(OBJECT_CONSTRUCT('COLUMN_NAME',COLUMN_NAME, 'TYPE',TYPE, 'NULLABLE', NULLABLE, 'EXPRESSION',EXPRESSION)) FROM TABLE( INFER_SCHEMA( LOCATION=>'@mystage', FILE_FORMAT=>'my_parquet_format' ) ) ) LOCATION=@mystage FILE_FORMAT=my_parquet_format AUTO_REFRESH=false;