Types de données des tables Apache Iceberg™

Snowflake prend en charge la plupart des types de données définis par la spécification Apache Iceberg™, et écrit les types de données Iceberg dans les fichiers de table afin que vos tables Iceberg restent interopérables entre les différents moteurs de calcul lorsque vous utilisez Snowflake comme catalogue.

Pour une vue d’ensemble des types de données Iceberg pris en charge par Snowflake, voir Types de données pris en charge.

Types approximatifs

Si votre table utilise un type de données Iceberg pour lequel Snowflake ne prend pas en charge une correspondance exacte, Snowflake utilise un type Snowflake approximatif. Ce type de mappage affecte les valeurs des colonnes des tables converties et des tables Iceberg qui utilisent Snowflake comme catalogue.

Prenons l’exemple d’une table comportant une colonne de type Iceberg int. Snowflake traite les valeurs des colonnes en utilisant le type de données Snowflake NUMBER(10,0).

NUMBER(10,0) a une plage de (-9,999,999,999, +9,999,999,999), mais int a une plage plus limitée de (-2,147,483,648, +2,147,483,647). Si vous essayez d’insérer une valeur 3,000,000,000 dans cette colonne, Snowflake renvoie un message d’erreur hors plage.

Pour plus de détails sur les types approximatifs, voir les notes dans le tableau Types de données pris en charge.

Types de données pris en charge

Le tableau dans cette section montre la relation entre les types de données Iceberg et les types de données Snowflake. Les colonnes suivantes sont utilisées :

Type Iceberg:

Type de données défini dans la spécification Apache Iceberg. Lorsque vous utilisez Snowflake comme catalogue, Snowflake écrit le type Iceberg dans les fichiers de données des tables afin que celles-ci restent interopérables entre les différents moteurs de calcul.

Type Snowflake:

Type de données Snowflake utilisé pour traiter et renvoyer les données de table. Par exemple, si votre schéma spécifie le type Iceberg timestamp, Snowflake traite et renvoie des valeurs utilisant le type de données Snowflake TIMESTAMP_NTZ(6) à une précision de l’ordre de la microseconde.

Remarques:

Notes sur l’utilisation supplémentaires, notamment pour utiliser les types approximatifs.

Types numériques

Snowflake comme catalogue

Le tableau suivant montre comment les types de données numériques Iceberg mappent les types de données numériques Snowflake pour les tables qui utilisent Snowflake comme catalogue Iceberg (tables gérées par Snowflake). Lorsque vous créez une table Iceberg gérée par Snowflake, vous pouvez utiliser les types de données Iceberg pour définir les colonnes numériques.

Type de données Iceberg

Type de données Snowflake

Remarques

int (entier signé de 32 bits)

NUMBER(10,0)

L’insertion d’un nombre à 10 chiffres inférieur à la valeur minimale ou supérieur à la valeur maximale d’un entier signé de 32 bits entraîne une erreur hors plage.

long (entier signé de 64 bits)

NUMBER(19,0)

L’insertion d’un nombre à 19 chiffres inférieur à la valeur minimale ou supérieur à la valeur maximale d’un entier signé de 64 bits entraîne une erreur hors plage.

float (virgule flottante IEEE 754 de 32 bits simple précision)

FLOAT

Synonyme du type de données DOUBLE Snowflake. Snowflake traite tous les nombres à virgule flottante comme des nombres à virgule flottante de 64 bits double précision, mais écrit les nombres à virgule flottante Iceberg comme des nombres à virgule flottante de 32 bits dans les fichiers de données des tables.

Le fait de réduire les conversions de 64 bits à 32 bits entraîne une perte de précision.

Vous ne pouvez pas utiliser float ni double comme clés primaires (conformément à la spécification Apache Iceberg).

double (virgule flottante IEEE 754 de 64 bits double précision)

FLOAT

Synonyme du type de données DOUBLE Snowflake. Snowflake traite tous les nombres à virgule flottante comme des nombres à virgule flottante de 64 bits double précision.

Le fait de réduire les conversions de 64 bits à 32 bits entraîne une perte de précision.

Vous ne pouvez pas utiliser float ni double comme clés primaires (conformément à la spécification Apache Iceberg).

decimal(P,S)

NUMBER(P,S)

En spécifiant decimal(10,0) au lieu de int , vous créez un type décimal dans Iceberg. Il en va de même lorsque vous spécifiez decimal(19,0).

Catalogue externe

Lorsque vous créez une table Iceberg qui utilise un catalogue Iceberg externe, les types numériques Iceberg sont mappés aux types numériques Snowflake selon le tableau suivant.

Type de données Iceberg

Type de données Snowflake

int (entier signé de 32 bits)

NUMBER(10,0)

long (entier signé de 64 bits)

NUMBER(19,0)

float (virgule flottante IEEE 754 de 32 bits simple précision)

FLOAT

double (virgule flottante IEEE 754 de 64 bits double précision)

FLOAT

decimal(P,S)

NUMBER(P,S)

Note

Vous ne pouvez pas utiliser float ni double comme clés primaires (conformément à la spécification Apache Iceberg).

Autres types de données

Type de données Iceberg

Type de données Snowflake

Remarques

boolean

BOOLEAN

date

DATE

time

TIME(6)

Précision à la microseconde selon les spécifications de la table Apache Iceberg.

timestamp

TIMESTAMP_NTZ(6) ou TIMESTAMP_LTZ(6), en fonction de la valeur du paramètre Snowflake TIMESTAMP_TYPE_MAPPING.

Précision à la microseconde selon les spécifications de la table Apache Iceberg.

Vous pouvez également utiliser le type physique Parquet int96 pour les horodatages. Snowflake traduit timestamp en microsecondes (conformément aux spécifications de la table Apache Iceberg).

timestamptz

TIMESTAMP_LTZ(6)

Précision à la microseconde selon les spécifications de la table Apache Iceberg.

Vous pouvez également utiliser le type physique Parquet int96 pour les horodatages. Snowflake traduit timestamp en microsecondes (conformément aux spécifications de la table Apache Iceberg).

string

VARCHAR(16777216)

uuid

BINARY(16)

Le type de données uuid n’est pas pris en charge pour les tables qui utilisent Snowflake comme catalogue, ni pour les tables converties.

Lorsque vous utilisez un catalogue externe ou que vous créez une table à partir de fichiers dans le stockage d’objets, Snowflake mappe le type Iceberg uuid vers le type Snowflake BINARY(16).

struct

OBJECT structuré

Les colonnes de type structuré prennent en charge un maximum de 1 000 sous-colonnes.

list

ARRAY structuré

Les colonnes de type structuré prennent en charge un maximum de 1 000 sous-colonnes.

map

MAP

Les colonnes de type structuré prennent en charge un maximum de 1 000 sous-colonnes.

Types de données Delta

Le tableau suivant montre comment les types de données Delta mappent les types de données Snowflake pour les tables Iceberg créées à partir de fichiers de table Delta.

Type Delta

Type de données Snowflake

BYTE

NUMBER(3,0)

SHORT

NUMBER(5,0)

INTEGER

NUMBER(10,0)

LONG

NUMBER(20,0)

FLOAT

REAL

DOUBLE

REAL

TIMESTAMP

TIMESTAMP_LTZ(6)

TIMESTAMP_NTZ

TIMESTAMP_NTZ(6)

BINARY

BINARY

STRING

TEXT

BOOLEAN

BOOLEAN

DECIMAL(P,S)

NUMBER(P,S)

Le tableau suivant montre comment les types de données imbriqués Delta mappent les types de données Snowflake.

Type imbriqué Delta

Type de données Snowflake

STRUCT

OBJECT structuré

ARRAY

ARRAY structuré

MAP

MAP

Considérations

Tenez compte des éléments suivants lorsque vous utilisez des types de données pour les tables Iceberg :

  • La conversion d’une table dont les colonnes utilisent les types de données Iceberg suivants n’est pas prise en charge :

    • uuid

    • fixed(L)

  • Pour les tables qui utilisent Snowflake comme catalogue, la création d’une table qui utilise le type de données Iceberg uuid n’est pas prise en charge.

  • Pour tous les types de table Iceberg :

    • Les colonnes de type structuré prennent en charge un maximum de 1 000 sous-colonnes.

    • Iceberg prend en charge la précision à la microseconde pour les types time (temps) et timestamp (horodatage). Par conséquent, vous ne pouvez pas créer une table Iceberg dans Snowflake qui utilise une autre précision comme une précision à la milliseconde ou à la nanoseconde.

    • Vous ne pouvez pas utiliser float ni double comme clés primaires (conformément à la spécification Apache Iceberg).

  • Pour les tables créées à partir de fichiers Delta :

    • Les fichiers Parquet (fichiers de données pour les tables Delta) qui utilisent l’une des fonctionnalités ou l’un des types de données suivants ne sont pas pris en charge :

      • IDs de champ.

      • Le type de données est INTERVAL.

      • Le type de données DECIMAL avec une précision supérieure à 38.

      • Types LIST ou MAP avec représentation à un ou deux niveaux.

      • Types d’entiers non signés (INT(signé = faux)).

      • Le type de données est FLOAT16.