Erstellen Sie mithilfe der Partitionsprojektion mit Parquet eine Tabelle für CloudFront-Protokolle in Athena
Die folgende Beispielanweisung CREATE TABLE verwendet automatisch die Partitionsprojektion für CloudFront-Protokolle in Parquet, aus einer angegebenen CloudFront-Verteilung bis zum aktuellen Zeitpunkt für eine einzelne AWS-Region. Nach dem erfolgreichen Ausführen der Abfrage können Sie die Tabelle abfragen.
CREATE EXTERNAL TABLE `cloudfront_logs_parquet_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.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat' LOCATION 's3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/' TBLPROPERTIES ( 'projection.distributionid.type'='enum', 'projection.distributionid.values'='E3OK0LPUNWWO3', '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'='2019,2025', 'projection.year.type'='integer', 'projection.hour.range'='01,12', '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}/')
Im Folgenden finden Sie einige Überlegungen zu den im vorherigen Beispiel verwendeten Eigenschaften.
Tabellenname — Der Tabellenname
ist austauschbar. Sie können ihn in einen beliebigen Namen ändern.cloudfront_logs_ppStandort — Ändern Sie
s3://so dass er auf Ihren Amazon-S3-Bucket verweist.amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/Vertriebs-IDs — Für
projection.distributionid.valueskönnen Sie mehrere Vertriebs-IDs angeben, wenn Sie sie durch Kommas trennen. Zum Beispiel,<distributionID1>,<distributionID2>.Jahresbereich — In
projection.year.rangekönnen Sie den Jahresbereich auf der Grundlage Ihrer Daten definieren. Sie können ihn beispielsweise an einen beliebigen Zeitraum anpassen, z. B. 2025, 2026.Anmerkung
Das Einbeziehen leerer Partitionen, z. B. für future Daten (Beispiel: 2025-2040), kann sich auf die Abfrageleistung auswirken. Die Partitionsprojektion ist jedoch so konzipiert, dass zukünftige Daten effektiv verarbeiten werden können. Um eine optimale Leistung zu gewährleisten, sollten Sie sicherstellen, dass die Partitionen sorgfältig verwaltet werden, und vermeiden Sie, wenn möglich, übermäßige leere Partitionen.
Speicherortvorlage — Sie müssen sicherstellen, dass
storage.location.templateauf der Grundlage der folgenden CloudFront-Partitionierungsstruktur und des S3-Pfads korrekt aktualisiert wird.Parameter Pattern CloudFront-Partitionsstruktur AWSLogs/{AWS_ACCOUNT_ID}/CloudFront/{DistributionId}/folder2/{yyyy}/{MM}/{dd}/{HH}/folder3S3-Pfad s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/CloudFront/E2Oxxxxxxxxxxx/folder2/2025/01/25/03/folder3/Nachdem Sie bestätigen dass die CloudFront-Partitionierungsstruktur und die S3-Struktur den erforderlichen Mustern entsprechen, aktualisieren Sie
storage.location.templatewie folgt:'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'Anmerkung
Die richtige Konfiguration von
storage.location.templateist entscheidend für die korrekte Datenspeicherung und den korrekten Abruf von Daten.