

# Creación de una tabla para los registros de CloudFront en Athena mediante la proyección de particiones con JSON
<a name="create-cloudfront-table-partition-json"></a>

Puede reducir el tiempo de ejecución de las consultas y automatizar la administración de particiones con la característica de proyección de particiones de Athena. La proyección de particiones agrega de forma automática nuevas particiones a medida que se agregan nuevos datos. Esto hace que no sea necesario agregar particiones manualmente mediante `ALTER TABLE ADD PARTITION`.

En el siguiente ejemplo, la instrucción CREATE TABLE utiliza automáticamente la proyección de particiones en los registros de CloudFront desde una distribución especificada de CloudFront hasta el presente para una sola Región de AWS. Una vez ejecutada la consulta correctamente, puede consultar la tabla.

```
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}/')
```

A continuación, se presentan algunas consideraciones sobre las propiedades utilizadas en el ejemplo anterior.
+ **Nombre de la tabla:** el nombre de la tabla *`cloudfront_logs_pp`* se puede reemplazar. Puede cambiarlo por el nombre que prefiera.
+ **Ubicación:** modifique `s3://amzn-s3-demo-bucket/AWSLogs/AWS_ACCOUNT_ID/` para que apunte a su bucket de Amazon S3.
+ **ID de distribución:** para `projection.distributionid.values`, puede especificar varios ID de distribución si los separa con comas. Por ejemplo, *<distributionID1>*, *<distributionID2>*.
+ **Rango de años:** en `projection.year.range`, puede definir el rango de años en función de sus datos. Por ejemplo, puede ajustarlo a cualquier período, como *2025*, *2026*.
**nota**  
La inclusión de particiones vacías, como las de fechas futuras (por ejemplo: 2025-2040), puede afectar al rendimiento de las consultas. Sin embargo, la proyección de particiones está diseñada para gestionar de forma eficaz las fechas futuras. Para mantener un rendimiento óptimo, asegúrese de que las particiones se gestionen de forma cuidadosa y evite el exceso de particiones vacías siempre que sea posible.
+ **Plantilla de ubicación de almacenamiento:** debe asegurarse de actualizar el `storage.location.template` correctamente según la siguiente estructura de particiones de CloudFront y la ruta de S3.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/athena/latest/ug/create-cloudfront-table-partition-json.html)

  Después de confirmar que la estructura de particiones de CloudFront y la estructura de S3 coinciden con los patrones requeridos, actualice el `storage.location.template` de la siguiente manera:

  ```
  'storage.location.template'='s3://amzn-s3-demo-bucket/AWSLogs/account_id/CloudFront/${distributionid}/folder2/${year}/${month}/${day}/${hour}/folder3/'
  ```
**nota**  
La configuración adecuada del `storage.location.template` es crucial para garantizar el correcto almacenamiento y recuperación de los datos.