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.

Siehe auch:

ALTER EXTERNAL TABLE, DROP EXTERNAL TABLE, SHOW EXTERNAL TABLES, DESCRIBE EXTERNAL TABLE

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>' , ... ] ) ]
Copy

Wobei:

inlineConstraint ::=
  [ NOT NULL ]
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY | [ FOREIGN KEY ] REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> ] ) ] }
  [ <constraint_properties> ]
Copy

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>' ]
Copy
externalStage ::=
  @[<namespace>.]<ext_stage_name>[/<path>]
Copy
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
Copy

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>
  [ ... ]
Copy

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 Form database_name.schema_name oder schema_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 Eigenschaftswert url. Wenn die URL des Stagingbereichs beispielsweise den Pfad a enthält und der Speicherort der externen Tabelle den Pfad b enthält, liest die externe Tabelle Dateien, die in stage/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 Parameter PATTERN.

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 und TYPE 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)
Copy
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" } }
Copy

Fügen Sie eine VARCHAR-Spalte mit dem Namen mycol hinzu, die auf das verschachtelte, sich wiederholende Element c in der Stagingdatei verweist:

mycol varchar as (value:"b"."c"::varchar)
Copy
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

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 auch AUTO_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:

Manuell hinzugefügt:

Erforderlich: Setzen Sie auch den Wert des Parameters PARTITION_TYPE auf USER_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 und col3 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)
Copy

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 von AUTO.

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 (mit 0x 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 (mit 0x 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- oder RECORD_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 Dateiformatoption RECORD_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 auf NONE.

  • 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 bei FIELD_DELIMITER = '|' und FIELD_OPTIONALLY_ENCLOSED_BY = '"':

|"Hello world"|    /* returned as */  >Hello world<
|" Hello world "|  /* returned as */  > Hello world <
| "Hello world" |  /* returned as */  >Hello world<
Copy

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 von 2 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 der ESCAPE_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 -Wert

Unterstü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 von AUTO.

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 auf TRUE 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 von AUTO.

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 von 2 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 der ESCAPE_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/

  1. 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/'
      ...
      ;
    
    Copy

    Google Cloud Storage

    CREATE STAGE s1
      URL='gcs://mybucket/files/logs/'
      ...
      ;
    
    Copy

    Microsoft Azure

    CREATE STAGE s1
      URL='azure://mycontainer/files/logs/'
      ...
      ;
    
    Copy
  2. 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 |
    +----------------------------------------+
    
    Copy
  3. Erstellen Sie die partitionierte externe Tabelle.

    In der Partitionsspalte date_part wird YYYY/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';
    
    Copy

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

    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);
    
    Copy
  4. Aktualisieren der Metadaten der externen Tabelle:

    ALTER EXTERNAL TABLE et1 REFRESH;
    
    Copy

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

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).

  1. 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/'
      ...
      ;
    
    Copy

    Google Cloud Storage

    CREATE STAGE s2
      URL='gcs://mybucket/files/logs/'
      ...
      ;
    
    Copy

    Microsoft Azure

    CREATE STAGE s2
      URL='azure://mycontainer/files/logs/'
      ...
      ;
    
    Copy
  2. 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);
    
    Copy
  3. 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';
    
    Copy

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

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

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

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

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

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