Exemple d'Amazon Data Firehose - 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.

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 TABLEexemple 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 type date (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}')