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.
Exemple d'Amazon Data Firehose
Lorsque vous utilisez Firehose pour transmettre des données à Amazon S3, la configuration par défaut écrit des objets avec des clés qui ressemblent à l'exemple suivant :
s3://DOC-EXAMPLE-BUCKET/prefix/yyyy/MM/dd/HH/file.extension
Pour créer une table Athena qui trouve les partitions automatiquement au moment de la requête, au lieu de devoir les ajouter à AWS Glue Data Catalog mesure que de nouvelles données arrivent, vous pouvez utiliser la projection de partitions.
L'CREATE TABLE
exemple suivant utilise la configuration Firehose par défaut.
CREATE EXTERNAL TABLE my_ingested_data ( ... ) ... PARTITIONED BY ( datehour STRING ) LOCATION "s3://DOC-EXAMPLE-BUCKET/
prefix
/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.datehour.type" = "date", "projection.datehour.format" = "yyyy/MM/dd/HH", "projection.datehour.range" = "2021/01/01/00,NOW", "projection.datehour.interval" = "1", "projection.datehour.interval.unit" = "HOURS", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/prefix
/${datehour}/" )
La clause TBLPROPERTIES
dans l'instruction CREATE TABLE
indique à Athena ce qui suit :
-
Utiliser la projection de partition lors de l'interrogation de la table
-
La clé de partition
datehour
est de typedate
(qui inclut une heure facultative) -
Comment les dates sont formatées
-
La plage de dates et heures. Notez que les valeurs doivent être séparées par une virgule, et non par un tiret.
-
Où trouver les données sur Amazon S3.
Lorsque vous interrogez la table, Athena calcule les valeurs pour datehour
et utilise le modèle d'emplacement de stockage pour générer une liste d'emplacements de partition.
Utilisation du type date
Lorsque vous utilisez le type date
pour une clé de partition projetée, vous devez spécifier une plage. Comme vous ne disposez d'aucune donnée concernant les dates antérieures à la création du flux de diffusion Firehose, vous pouvez utiliser la date de création comme point de départ. Et comme vous ne disposez pas de données pour les dates à l'avenir, vous pouvez utiliser le jeton spécial NOW
comme fin.
Dans l'exemple CREATE TABLE
, la date de début est spécifiée le 1er janvier 2021 à minuit UTC.
Note
Configurez une plage qui correspond aussi précisément que possible à vos données afin qu'Athena ne recherche que les partitions existantes.
Lorsqu'une requête est exécutée sur la table d'exemple, Athena utilise les conditions sur la clé de partition datehour
en combinaison avec la plage pour générer des valeurs. Considérons la requête suivante :
SELECT * FROM my_ingested_data WHERE datehour >= '2020/12/15/00' AND datehour < '2021/02/03/15'
La première condition dans la requête SELECT
utilise une date antérieure au début de la plage de dates spécifiée par l'instruction CREATE TABLE
. Étant donné que la configuration de projection de partitions ne spécifie aucune partition pour les dates antérieures au 1er janvier 2021, Athena recherche des données uniquement aux emplacements suivants et ignore les dates antérieures dans la requête.
s3://DOC-EXAMPLE-BUCKET/prefix/2021/01/01/00/ s3://DOC-EXAMPLE-BUCKET/prefix/2021/01/01/01/ s3://DOC-EXAMPLE-BUCKET/prefix/2021/01/01/02/ ... s3://DOC-EXAMPLE-BUCKET/prefix/2021/02/03/12/ s3://DOC-EXAMPLE-BUCKET/prefix/2021/02/03/13/ s3://DOC-EXAMPLE-BUCKET/prefix/2021/02/03/14/
De même, si la requête s'est exécutée à une date et une heure avant le 3 février 2021 à 15 h 00, la dernière partition refléterait la date et l'heure actuelles, et non la date et l'heure dans la condition de requête.
Si vous souhaitez rechercher les données les plus récentes, vous pouvez profiter du fait qu'Athena ne génère pas de dates futures et ne spécifier qu'une datehour
de début, comme dans l'exemple suivant.
SELECT * FROM my_ingested_data WHERE datehour >= '2021/11/09/00'
Choix des clés de partition
Vous pouvez spécifier comment la projection de partition mappe les emplacements des partitions aux clés de partition. Dans l'exemple CREATE TABLE
de la section précédente, la date et l'heure ont été combinées dans une clé de partition appelée datehour, mais d'autres schémas sont possibles. Par exemple, vous pouvez également configurer une table avec des clés de partition distinctes pour l'année, le mois, le jour et l'heure.
Cependant, si vous divisez les dates en année, mois et jour, le type de projection de partition de date
ne peut pas être utilisé. Une alternative consiste à séparer la date de l'heure afin de continuer à exploiter le type de projection de partition de date
, tout en facilitant la lecture des requêtes qui spécifient des plages d'heures.
Dans cette optique, l'exemple CREATE TABLE
suivant sépare la date de l'heure. Étant donné que date
est un mot réservé dans SQL, l'exemple utilise day
comme nom de la clé de partition qui représente la date.
CREATE EXTERNAL TABLE my_ingested_data2 ( ... ) ... PARTITIONED BY ( day STRING, hour INT ) LOCATION "s3://DOC-EXAMPLE-BUCKET/
prefix
/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.format" = "yyyy/MM/dd", "projection.day.range" = "2021/01/01,NOW", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "projection.hour.type" = "integer", "projection.hour.range" = "0,23", "projection.hour.digits" = "2", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/prefix
/${day}/${hour}/" )
Dans l'exemple d'instruction CREATE TABLE
, l'heure est une clé de partition distincte, configurée comme un nombre entier. La configuration de la clé de partition des heures spécifie la plage 0 à 23, et que l'heure doit être formatée à deux chiffres lorsque Athena génère les emplacements de partition.
Une requête pour la table my_ingested_data2
pourrait ressembler à ceci :
SELECT * FROM my_ingested_data2 WHERE day = '2021/11/09' AND hour > 3
Types de clés de partition et types de projection de partitions
Notez que la clé datehour
dans le premier exemple CREATE TABLE
est configurée comme date
dans la configuration de projection de partition, mais le type de clé de partition est string
. Il en va de même pour day
dans le second exemple. Les types de la configuration de projection de partition indiquent uniquement à Athena comment formater les valeurs lorsqu'elle génère les emplacements de partition. Les types que vous spécifiez ne modifient pas le type de clé de partition. Dans les requêtes, datehour
et day
sont de type string
.
Lorsqu'une requête inclut une condition telle que day = '2021/11/09'
, Athena analyse la chaîne située à droite de l'expression en utilisant le format de date spécifié dans la configuration de projection de partition. Après avoir vérifié que la date est comprise dans la plage configurée, Athena utilise à nouveau le format de date pour insérer la date sous forme de chaîne dans le modèle d'emplacement de stockage.
De même, pour une condition de requête telle que day > '2021/11/09'
, Athena analyse le côté droit et génère une liste de toutes les dates correspondantes dans la plage configurée. Le format de date est ensuite utilisé pour insérer chaque date dans le modèle d'emplacement de stockage afin de créer la liste des emplacements de partition.
Écrire la même condition que day > '2021-11-09'
ou day >
DATE '2021-11-09'
ne fonctionne pas. Dans le premier cas, le format de date ne correspond pas (notez les traits d'union plutôt que les barres obliques) et, dans le second cas, les types de données ne correspondent pas.
Utilisation de préfixes personnalisés et de partitionnement dynamique
Firehose peut être configuré avec des préfixes personnalisés et un partitionnement dynamique. À l'aide de ces fonctions, vous pouvez configurer les clés Amazon S3 et configurer des schémas de partitionnement qui prennent mieux en charge votre cas d'utilisation. Vous pouvez également utiliser la projection de partitions avec ces schémas de partitionnement et les configurer en conséquence.
Par exemple, vous pouvez utiliser la fonction de préfixe personnalisé pour obtenir des clés Amazon S3 dont les dates sont au format ISO au lieu du schéma par défaut yyyy/MM/dd/HH
.
Vous pouvez également combiner des préfixes personnalisés avec un partitionnement dynamique pour extraire une propriété, comme dans les messages customer_id
Firehose, comme dans l'exemple suivant.
prefix/!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/!{partitionKeyFromQuery:customer_id}/
Avec ce préfixe Amazon S3, le flux de diffusion Firehose écrirait des objets sur des clés telles que. s3://DOC-EXAMPLE-BUCKET/prefix/2021-11-01/customer-1234/file.extension
Pour une propriété comme customer_id
, où les valeurs peuvent ne pas être connues à l'avance, vous pouvez utiliser le type de projection de partition injected
et utilisez une instruction CREATE TABLE
comme suit :
CREATE EXTERNAL TABLE my_ingested_data3 ( ... ) ... PARTITIONED BY ( day STRING, customer_id STRING ) LOCATION "s3://DOC-EXAMPLE-BUCKET/
prefix
/" TBLPROPERTIES ( "projection.enabled" = "true", "projection.day.type" = "date", "projection.day.format" = "yyyy-MM-dd", "projection.day.range" = "2021-01-01,NOW", "projection.day.interval" = "1", "projection.day.interval.unit" = "DAYS", "projection.customer_id.type" = "injected", "storage.location.template" = "s3://DOC-EXAMPLE-BUCKET/prefix
/${day}/${customer_id}/" )
Lorsque vous interrogez une table comportant une clé de partition de type injected
, votre requête doit inclure une valeur pour cette clé de partition. Une requête pour la table my_ingested_data3
pourrait ressembler à ceci :
SELECT * FROM my_ingested_data3 WHERE day BETWEEN '2021-11-01' AND '2021-11-30' AND customer_id = 'customer-1234'
Dates au format ISO
Comme les valeurs de la clé de partition day
sont au format ISO, vous pouvez également utiliser le type DATE
pour la clé de partition day au lieu de STRING
, comme dans l'exemple suivant :
PARTITIONED BY (day DATE, customer_id STRING)
Lorsque vous effectuez une requête, cette stratégie vous permet d'utiliser des fonctions de date sur la clé de partition sans analyse ni diffusion, comme dans l'exemple suivant :
SELECT * FROM my_ingested_data3 WHERE day > CURRENT_DATE - INTERVAL '7' DAY AND customer_id = 'customer-1234'
Note
La spécification d'une clé de partition du type DATE
suppose que vous avez utilisé la fonctionnalité de préfixe personnalisé pour créer des clés Amazon S3 dont les dates sont au format ISO. Si vous utilisez le format Firehose par défaut deyyyy/MM/dd/HH
, vous devez spécifier la clé de partition en tant que type, string
même si la propriété de table correspondante est de typedate
, comme dans l'exemple suivant :
PARTITIONED BY ( `mydate` string) TBLPROPERTIES ( 'projection.enabled'='true', ... 'projection.mydate.type'='date', 'storage.location.template'='s3://DOC-EXAMPLE-BUCKET/prefix/${mydate}')