Datentypen von Iceberg-Tabellen

Unter diesem Thema finden Sie Informationen darüber, wie Datentypen für Iceberg-Tabellen in Snowflake funktionieren.

Wie Datentypen für Iceberg-Tabellen funktionieren

Snowflake unterstützt die meisten der in der Apache Iceberg-Spezifikation definierten Datentypen und schreibt Iceberg-Datentypen in Tabellendateien, sodass bei Verwendung von Snowflake als Katalog Ihre Iceberg-Tabellen über verschiedene Computemodule hinweg interoperabel bleiben.

Eine Übersicht zu den von Snowflake unterstützten Iceberg-Datentypen finden Sie unter Unterstützte Datentypen für Iceberg-Tabellen.

Iceberg-Typen zur Definition von Spalten verwenden

Wenn Sie eine Iceberg-Tabelle erstellen, die Snowflake als Katalog verwendet, können Sie Iceberg-Datentypen zur Definition von Spalten verwenden.

Beispiel:

CREATE OR REPLACE ICEBERG TABLE customer_table (
    boolean_col boolean,
    int_col int,
    long_col long,
    float_col float,
    double_col double,
    decimal_col decimal(10,5),
    string_col string,
    fixed_col fixed(10),
    binary_col binary,
    date_col date,
    time_col time,
    timestamp_ntz_col timestamp_ntz(6),
    timestamp_ltz_col timestamp_ltz(6)
  )
  CATALOG = 'SNOWFLAKE'
  EXTERNAL_VOLUME = 'my_ext_vol'
  BASE_LOCATION = 'my/relative/path/from/extvol';
Copy

Ungefähre Typen

Wenn Ihre Tabelle einen Iceberg-Datentyp verwendet, für den Snowflake keine exakte Übereinstimmung unterstützt, verwendet Snowflake einen ungefähren Snowflake-Typ. Diese Typzuordnung betrifft Spaltenwerte von konvertierten Tabellen und Iceberg-Tabellen, die Snowflake als Katalog verwenden.

Betrachten Sie beispielsweise eine Tabelle mit einer Spalte vom Iceberg-Typ int. Snowflake verarbeitet die Spaltenwerte mit dem Snowflake-Datentyp NUMBER(10,0).

NUMBER(10,0) hat einen Bereich von (-9.999.999.999, +9.999.999.999), aber int hat einen engeren Bereich von (-2.147.483.648, +2.147.483.647). Wenn Sie versuchen, einen Wert von 3.000.000.000 in diese Spalte einzufügen, gibt Snowflake eine Fehlermeldung zurück, dass der Wert außerhalb des Bereichs liegt.

Weitere Informationen zu ungefähren Datentypen finden Sie in den Anmerkungen unter Unterstützte Datentypen für Iceberg-Tabellen.

Unterstützte Datentypen für Iceberg-Tabellen

Die folgende Tabelle zeigt die Beziehung zwischen Iceberg-Datentypen und Snowflake-Datentypen. Sie verwendet die folgenden Spalten:

Iceberg-Typ

Der in der Apache Iceberg-Spezifikation definierte Datentyp. Wenn Sie Snowflake als Katalog verwenden, schreibt Snowflake den Iceberg-Typ in Ihre Tabellendateien, sodass Ihre Tabellen über verschiedene Computemodule hinweg interoperabel bleiben.

Snowflake-Typ

Der Snowflake-Datentyp, der für die Verarbeitung und Rückgabe von Tabellendaten verwendet wird. Wenn Ihr Schema beispielsweise den Iceberg-Typ timestamp angibt, verarbeitet und liefert Snowflake Werte mit dem Snowflake-Datentyp TIMESTAMP_NTZ(6) mit Mikrosekundengenauigkeit.

Anmerkungen

Zusätzliche Nutzungshinweise, einschließlich Hinweise zur Verwendung von ungefähren Datentypen.

Iceberg-Datentyp

Snowflake-Datentyp

Anmerkungen

boolean

BOOLEAN

int (vorzeichenbehaftete 32-Bit-Ganzzahl)

NUMBER(10,0)

Das Einfügen einer 10-stelligen Zahl, die kleiner als der minimale oder größer als der maximale 32-Bit-Wert einer vorzeichenbehafteten Ganzzahl ist, führt zu einem Out-of-Range-Fehler.

long (vorzeichenbehaftete 64-Bit-Ganzzahl)

NUMBER(19,0)

Das Einfügen einer 19-stelligen Zahl, die kleiner als der minimale oder größer als der maximale 64-Bit-Wert einer vorzeichenbehafteten Ganzzahl ist, führt zu einem Out-of-Range-Fehler.

float (32-Bit-Gleitkommazahl mit einfacher Genauigkeit nach IEEE 754)

FLOAT

Synonym für den Snowflake-Datentyp DOUBLE. Snowflake behandelt alle Gleitkommazahlen als doppeltgenaue 64-Bit-Gleitkommazahlen, schreibt aber Iceberg-Gleitkommazahlen als 32-Bit-Gleitkommazahlen in Tabellendateien.

Eine Verengung der Konvertierung von 64 Bit auf 32 Bit führt zu einem Genauigkeitsverlust.

double (64-Bit-Gleitkomma mit doppelter Genauigkeit nach IEEE 754)

FLOAT

Synonym für den Snowflake-Datentyp DOUBLE. Snowflake behandelt alle Gleitkommazahlen als doppeltgenaue 64-Bit-Gleitkommazahlen.

decimal(P,S)

NUMBER[(P,S)]

date

DATE

time

TIME(6)

Genauigkeit im Mikrosekundenbereich. Iceberg-Tabellen unterstützen keine anderen Genauigkeiten wie Millisekunden oder Nanosekunden.

timestamp

TIMESTAMP_NTZ(6)

Genauigkeit im Mikrosekundenbereich. Iceberg-Tabellen unterstützen keine anderen Genauigkeiten wie Millisekunden oder Nanosekunden.

Snowflake unterstützt nicht die Verwendung des veralteten physischen Parquet-Typs int96 für Zeitstempel.

timestamptz

TIMESTAMP_LTZ(6)

Genauigkeit im Mikrosekundenbereich. Iceberg-Tabellen unterstützen keine anderen Genauigkeiten wie Millisekunden oder Nanosekunden.

string

VARCHAR(16777216)

uuid

BINARY(16)

Der Datentyp „uuid“ wird nicht für Tabellen unterstützt, die Snowflake als Katalog verwenden, oder für konvertierte Tabellen.

Wenn Sie einen externen Katalog verwenden oder eine Tabelle aus Dateien im Objektspeicher erstellen, ordnet Snowflake den Iceberg-Typ „uuid“ dem Snowflake-Typ BINARY(16) zu.

fixed(L)

BINARY(L)

Sie können eine Iceberg-Tabelle mit diesem Typ erstellen, aber Sie können keine Tabelle konvertieren, die eine Spalte vom Typ „fixed(L)“ hat.

struct

Strukturierter OBJECT-Typ

list

Strukturierter ARRAY-Typ

map

MAP

Hinweise

Beachten Sie die folgenden Punkte, wenn Sie Datentypen für Iceberg-Tabellen verwenden:

  • Das Konvertieren einer Tabelle mit Spalten, die die folgenden Iceberg-Datentypen verwenden, wird nicht unterstützt:

    • uuid

    • fixed(L)

  • Bei Tabellen, die Snowflake als Katalog verwenden, wird das Erstellen einer Tabelle, die den Iceberg-Datentyp uuid verwendet, nicht unterstützt.

  • Bemerkung

    Iceberg unterstützt Mikrosekundengenauigkeit für Zeit- und Zeitstempeltypen. Folglich können Sie in Snowflake keine Iceberg-Tabelle erstellen, die eine andere Genauigkeit wie z. B. Millisekunden oder Nanosekunden verwendet.

  • Snowflake unterstützt nicht die Verwendung des veralteten physischen Parquet-Typs int96 für Zeitstempel.