Création d’une table pour les journaux CloudFront dans Athena à l’aide de la projection de partition avec un format JSON
Vous pouvez réduire le temps d’exécution des requêtes et automatiser la gestion des partitions grâce à la fonctionnalité de projection de partition Athena. La projection des partitions ajoute automatiquement de nouvelles partitions à mesure que de nouvelles données sont ajoutées. Vous n'avez donc plus besoin d'ajouter manuellement des partitions à l'aide de la commande ALTER
TABLE ADD PARTITION.
L’exemple d’instruction CREATE TABLE suivant utilise automatiquement la projection de partition sur les journaux CloudFront depuis une distribution CloudFront spécifiée jusqu’au moment présent pour une seule Région AWS. Après avoir exécuté la requête avec succès, vous pouvez interroger la table.
CREATE EXTERNAL TABLE `cloudfront_logs_pp`( `date` string, `time` string, `x-edge-location` string, `sc-bytes` string, `c-ip` string, `cs-method` string, `cs(host)` string, `cs-uri-stem` string, `sc-status` string, `cs(referer)` string, `cs(user-agent)` string, `cs-uri-query` string, `cs(cookie)` string, `x-edge-result-type` string, `x-edge-request-id` string, `x-host-header` string, `cs-protocol` string, `cs-bytes` string, `time-taken` string, `x-forwarded-for` string, `ssl-protocol` string, `ssl-cipher` string, `x-edge-response-result-type` string, `cs-protocol-version` string, `fle-status` string, `fle-encrypted-fields` string, `c-port` string, `time-to-first-byte` string, `x-edge-detailed-result-type` string, `sc-content-type` string, `sc-content-len` string, `sc-range-start` string, `sc-range-end` string) PARTITIONED BY( distributionid string, year int, month int, day int, hour int ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'paths'='c-ip,c-port,cs(Cookie),cs(Host),cs(Referer),cs(User-Agent),cs-bytes,cs-method,cs-protocol,cs-protocol-version,cs-uri-query,cs-uri-stem,date,fle-encrypted-fields,fle-status,sc-bytes,sc-content-len,sc-content-type,sc-range-end,sc-range-start,sc-status,ssl-cipher,ssl-protocol,time,time-taken,time-to-first-byte,x-edge-detailed-result-type,x-edge-location,x-edge-request-id,x-edge-response-result-type,x-edge-result-type,x-forwarded-for,x-host-header') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/' TBLPROPERTIES ( 'projection.distributionid.type'='enum', 'projection.distributionid.values'='E2Oxxxxxxxxxxx', 'projection.day.range'='01,31', 'projection.day.type'='integer', 'projection.day.digits'='2', 'projection.enabled'='true', 'projection.month.range'='01,12', 'projection.month.type'='integer', 'projection.month.digits'='2', 'projection.year.range'='2025,2026', 'projection.year.type'='integer', 'projection.hour.range'='00,23', 'projection.hour.type'='integer', 'projection.hour.digits'='2', 'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/${distributionid}/${year}/${month}/${day}/${hour}/')
Voici quelques éléments à prendre en compte concernant les propriétés utilisées dans l’exemple précédent.
Nom de la table – Le nom de la table
est remplaçable. Vous pouvez le remplacer par le nom de votre choix.cloudfront_logs_ppEmplacement – Modifiez
s3://pour pointer vers votre compartiment Amazon S3.amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/ID de distribution – Dans
projection.distributionid.values, vous pouvez spécifier plusieurs ID de distribution en les séparant par des virgules. Exemple :<distributionID1>,<distributionID2>.Plage d’années – Dans
projection.year.range, vous pouvez définir la plage d’années en fonction de vos données. Vous pouvez ainsi l’ajuster à n’importe quelle période, comme 2025, 2026.Note
L’inclusion de partitions vides, telles que celles associées à des dates futures (exemple : 2025-2040), peut avoir un impact sur les performances des requêtes. La projection de partition est cependant conçue pour gérer efficacement les dates futures. Pour maintenir des performances optimales, veillez à ce que les partitions soient gérées de manière réfléchie et évitez autant que possible un nombre excessif de partitions vides.
Modèle d’emplacement de stockage – Vous devez vous assurer de mettre correctement à jour
storage.location.templateen fonction de la structure de partitionnement CloudFront et du chemin S3 ci-dessous.Paramètre Modèle Structure de partitionnement CloudFront AWSLogs/{AWS_ACCOUNT_ID}/CloudFront/{DistributionId}/folder2/{yyyy}/{MM}/{dd}/{HH}/folder3Chemin S3 s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/E2Oxxxxxxxxxxx/folder2/2025/01/25/03/folder3/Après avoir vérifié que la structure de partitionnement CloudFront et la structure S3 correspondent aux modèles requis, mettez à jour
storage.location.templatecomme suit :'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'Note
Une configuration correcte de
storage.location.templateest essentielle pour garantir un stockage et une récupération corrects des données.