Types de données des tables Iceberg

Cette rubrique fournit des informations sur le fonctionnement des types de données des tables Iceberg dans Snowflake.

Fonctionnement des types de données des tables 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 pour les tables Iceberg.

Utiliser les types Iceberg pour définir les colonnes

Lorsque vous créez une table Iceberg qui utilise Snowflake comme catalogue, vous pouvez utiliser les types de données Iceberg pour définir les colonnes.

Par exemple :

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

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 pour les tables Iceberg.

Types de données pris en charge pour les tables Iceberg

Le tableau suivant montre la relation entre les types de données Iceberg et les types de données Snowflake. Il utilise les colonnes suivantes :

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.

Type de données Iceberg

Type de données Snowflake

Remarques

boolean

BOOLEAN

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.

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.

decimal(P,S)

NUMBER(P,S)

date

DATE

time

TIME(6)

Précision à la microseconde. Les tables Iceberg ne prennent pas en charge l’utilisation d’une autre précision comme celle à la milliseconde ou à la nanoseconde.

timestamp

TIMESTAMP_NTZ(6)

Précision à la microseconde. Les tables Iceberg ne prennent pas en charge l’utilisation d’une autre précision comme celle à la milliseconde ou à la nanoseconde.

Snowflake ne prend pas en charge l’utilisation du type physique Parquet int96, obsolète, pour les horodatages.

timestamptz

TIMESTAMP_LTZ(6)

Précision à la microseconde. Les tables Iceberg ne prennent pas en charge l’utilisation d’une autre précision comme celle à la milliseconde ou à la nanoseconde.

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

fixed(L)

BINARY(L)

Vous pouvez créer une table Iceberg qui utilise ce type, mais vous ne pouvez pas convertir une table qui a une colonne de type fixed(L).

struct

OBJECT structuré

list

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.

  • Note

    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.

  • Snowflake ne prend pas en charge l’utilisation du type physique Parquet int96, obsolète, pour les horodatages.