Types de données dans Amazon Athena - Amazon Athena

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Types de données dans Amazon Athena

Lorsque vous exécutez CREATE TABLE (CRÉER UNE TABLE), vous spécifiez des noms de colonne et le type de données que chaque colonne peut contenir. Athena prend en charge les types de données répertoriés ci-dessous. Pour plus d'informations sur les mappages de types de données que le pilote JDBC prend en charge entre Athena, JDBC et Java, consultez la rubrique Types de données du Guide d'installation et de configuration du pilote JDBC. Pour plus d'informations sur les mappages de types de données que le pilote ODBC prend en charge entre Athena et SQL, consultez la rubrique Types de données du Guide d'installation et de configuration du pilote ODBC.

  • boolean : les valeurs sont true et false.

  • tinyint – Un entier signé de 8 bits au format de complément à deux avec une valeur minimum de -27 et une valeur maximum de 27-1.

  • smallint – Un entier signé de 16 bits au format de complément à deux avec une valeur minimum de -215 et une valeur maximum de 215-1.

  • int et integer : Athena utilise différentes expressions pour les entiers en fonction du type de requête.

    • int : dans les requêtes DDL (Data Definition Language) telles que CREATE TABLE, utilisez le type de données int.

    • integer : dans les requêtes DML telles que SELECT * FROM, utilisez le type de données integer. integer est représenté sous la forme d'une valeur de 32 bits signée au format de complément à deux, avec une valeur minimum de -231 et une valeur maximum de 231-1.

      • Afin de garantir la compatibilité avec les applications d'analyse d'entreprise, le pilote JDBC renvoie le type integer.

  • bigint – Un entier signé de 64 bits au format de complément à deux avec une valeur minimum de -263 et une valeur maximum de 263-1.

  • double : un nombre à virgule flottante signé de 64 bits en double précision. La plage va de 4.94065645841246544e-324d à 1.79769313486231570e+308d, positif ou négatif. double suit le standard IEEE pour l'arithmétique à virgule flottante (IEEE 754).

  • float : un nombre à virgule flottante signé à simple précision de 32 bits. La plage va de 1.40129846432481707e-45 à 3.40282346638528860e+38, positif ou négatif. float suit le standard IEEE pour l'arithmétique à virgule flottante (IEEE 754). Équivalent à real dans Presto. Dans Athena, utilisez float dans les Instructions DDL comme CREATE TABLE et real dans les fonctions SQL comme SELECT CAST. Le AWS Glue crawler renvoie des valeursfloat, et Athena les real traduit float et les saisit en interne (voir 5 juin 2018 les notes de publication).

  • decimal(precision, scale)precision est le nombre total de chiffres. scale (facultatif) est le nombre de chiffres dans la partie fractionnaire avec une valeur par défaut de 0. Par exemple, utilisez ces définitions de type : decimal(11,5), decimal(15). La valeur maximale pour la précision est de 38, et la valeur maximale pour l'échelle est de 38.

    Pour spécifier des valeurs décimales comme les littéraux, par exemple lorsque vous sélectionnez des lignes avec une valeur décimale dans une expression de requête DDL, spécifiez la définition de type decimal et répertoriez la valeur décimale en tant que valeur littérale (entre des guillemets simples) dans votre requête, comme dans l'exemple suivant : decimal_value = decimal '0.12'.

  • char : données en caractères de longueur fixe, avec une longueur spécifiée entre 1 et 255, par exemple char(10). Pour plus d'informations, consultez la section relative au type de données Hive CHAR.

    Note

    Pour utiliser la fonction substr pour renvoyer une sous-chaîne de longueur spécifiée à partir d'un type de données char, vous devez d'abord convertir la valeur char sous la forme de varchar, comme dans l'exemple suivant.

    substr(cast(col1 as varchar), 1, 4)
  • varchar : données en caractères de longueur variable, avec une longueur spécifiée entre 1 et 65535, par exemple varchar(10). Pour plus d'informations, consultez la section relative au type de données Hive VARCHAR.

  • string : libellé chaîne entre guillemets simples ou doubles. Pour plus d'informations, consultez la section relative au type de données Hive STRING.

    Note

    Les types de données autres que les chaînes de caractères ne peuvent pas être convertis en string dans Athena ; convertissez-les plutôt en varchar.

  • ipaddress— Représente une adresse IP dans les requêtes DML. Non pris en charge pour le DDL. Pour plus d'informations, consultez IPADDRESS.

  • binary : utilisé pour les données au format Parquet.

  • date : date au format ISO, par exemple YYYY-MM-DD. Par exemple, date '2008-09-15'. Une exception est l'SerDeOpenCSV, qui utilise le nombre de jours écoulés depuis le 1er janvier 1970. Pour de plus amples informations, veuillez consulter OpenCSVSerDe pour le traitement CSV.

  • timestamp : date et heure instantanée dans java.sql.Timestamp jusqu'à une résolution maximale de millisecondes, comme yyyy-MM-dd HH:mm:ss[.f...]. Par exemple, timestamp '2008-09-15 03:04:05.324'. L'SerDeOpenCSV constitue une exception, car il timestamp utilise des données au format numérique UNIX (par exemple,). 1579059880000

    Pour plus d'informations sur l'utilisation d'horodatages, consultez Utilisation des données d'horodatage plus loin dans ce document.

  • array<data_type> : un tableau du type de composant donné.

    Exemple

    CREATE TABLE table array_table (c1 array<integer>) LOCATION '...'; INSERT INTO array_table values(ARRAY[1,2,3]);
  • map<primitive_type, data_type> : une carte entre les types de composants donnés.

    Exemple

    CREATE TABLE map_table(c1 map<string, integer>) LOCATION '...'; INSERT INTO map_table values(MAP(ARRAY['foo', 'bar'], ARRAY[1, 2]));
  • struct<col_name : data_type, ...> : un ensemble d'éléments de différents types de composants.

    Exemple

    CREATE TABLE struct_table(c1 struct<name:varchar(10), age:integer>) LOCATION '...'; INSERT INTO struct_table SELECT CAST(ROW('Bob', 38) AS ROW(name VARCHAR(10), age INTEGER));

Utilisation des données d'horodatage

Cette section décrit certaines considérations relatives à l'utilisation des données d'horodatage dans Athena.

Note

Le traitement des horodatages a quelque peu changé entre les versions 2 et 3 du moteur Athena. Pour plus d'informations sur les erreurs liées à l'horodatage qui peuvent se produire dans la version 3 du moteur Athena et sur les solutions proposées, consultez Modifications d'horodatage dans la référence Version 3 du moteur Athena.

Format pour écrire des données d'horodatage dans des objets Amazon S3

Le format dans lequel les données d'horodatage doivent être écrites dans les objets Amazon S3 dépend à la fois du type de données de colonne et de la SerDebibliothèque que vous utilisez.

  • Si vous avez une colonne de table de type DATE, Athena s'attend à ce que la colonne ou la propriété correspondante des données soit une chaîne au format ISO YYYY-MM-DD ou un type de date intégré comme ceux de Parquet ou ORC.

  • Si vous avez une colonne de table de type TIME, Athena s'attend à ce que la colonne ou la propriété correspondante des données soit une chaîne au format ISO HH:MM:SS ou un type d'heure intégré comme ceux de Parquet ou ORC.

  • Si vous avez une colonne de table de type TIMESTAMP, Athena s'attend à ce que la colonne ou la propriété correspondante des données soit une chaîne au format YYYY-MM-DD HH:MM:SS.SSS (notez l'espace entre la date et l'heure) ou un type d'heure intégré comme ceux de Parquet, ORC ou Ion.

    Note

    Les horodatages SerDe OpenCSV constituent une exception et doivent être codés sous forme d'époques UNIX d'une résolution de l'ordre de la milliseconde.

S'assurer que les données partitionnées dans le temps correspondent au champ d'horodatage d'un enregistrement

Le producteur des données doit s'assurer que les valeurs de partition correspondent aux données contenues dans la partition. Par exemple, si vos données ont une timestamp propriété et que vous utilisez Firehose pour les charger dans Amazon S3, vous devez utiliser le partitionnement dynamique car le partitionnement par défaut de Firehose est le suivant. wall-clock-based

Utiliser STRING comme type de données pour les clés de partition

Pour des raisons de performances, il est préférable d'utiliser STRING comme type de données pour les clés de partition. Même si Athena reconnaît les valeurs de partition au format YYYY-MM-DD comme des dates lorsque vous utilisez le type DATE, cela peut entraîner de mauvaises performances. Pour cette raison, nous vous recommandons d'utiliser plutôt le type de données STRING pour les clés de partition.

Comment écrire des requêtes pour des champs d'horodatage qui sont également partitionnés dans le temps

La façon dont vous rédigez les requêtes pour les champs d'horodatage partitionnés dans le temps dépend du type de table que vous souhaitez interroger.

Tables Hive

Avec les tables Hive les plus couramment utilisées dans Athena, le moteur de requête n'a aucune connaissance des relations entre les colonnes et les clés de partition. Pour cette raison, vous devez toujours ajouter des prédicats dans vos requêtes pour la colonne et pour la clé de partition.

Supposons, par exemple, que vous disposiez d'une colonne event_time et d'une clé de partition event_date et que vous souhaitiez interroger des événements survenus entre 23 h 00 et 03 h 00. Dans ce cas, vous devez inclure des prédicats dans votre requête pour la colonne et pour la clé de partition, comme dans l'exemple suivant.

WHERE event_time BETWEEN start_time AND end_time AND event_date BETWEEN start_time_date AND end_time_date

Tables Iceberg

Avec les tables Iceberg, vous pouvez utiliser des valeurs de partition calculées, ce qui simplifie vos requêtes. Supposons, par exemple, que votre table Iceberg ait été créée avec une clause PARTITIONED BY comme celle-ci :

PARTITIONED BY (event_date month(event_time))

Dans ce cas, le moteur de requête réduit automatiquement les partitions en fonction des valeurs des prédicats event_time. Pour cette raison, votre requête doit uniquement spécifier un prédicat pour event_time, comme dans l'exemple suivant.

WHERE event_time BETWEEN start_time AND end_time

Pour de plus amples informations, veuillez consulter Création de tables Iceberg.