Comment utiliser des préfixes personnalisés et le partitionnement dynamique
Firehose peut être configuré pour utiliser des préfixes personnalisés et le 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 le partitionnement dynamique pour extraire une propriété telle que customer_id de messages Firehose, comme illustré 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 écrit les objets dans des clés telles que s3://amzn-s3-demo-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://amzn-s3-demo-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://amzn-s3-demo-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'
Utilisation du type DATE pour la clé de partition de jour
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 yyyy/MM/dd/HH, vous devez spécifier la clé de partition comme type string, même si la propriété de table correspondante est de type date, comme dans l’exemple suivant :
PARTITIONED BY ( `mydate` string) TBLPROPERTIES ( 'projection.enabled'='true', ... 'projection.mydate.type'='date', 'storage.location.template'='s3://amzn-s3-demo-bucket/prefix/${mydate}')