Quiero usar la proyección de partición de Athena para escribir consultas que filtren en columnas de partición de fecha. El problema es que el formato de datos físicos (ubicación de datos S3) no coincide con ninguno de los posibles formatos de fecha permitidos para los tipos de fecha en la proyección de partición de Athena.

Mi formato de datos físicos en S3 usa fechas codificadas en URL: s3://bucket/table_root/landing_time=yyyy-MM-dd%20HH%3Amm%3Ass.S'

Consulta de Athena Ex:

select * from table_root where landing_time='2020-01-01 12:00:00.0'

Configuración de la tabla utilizada para la proyección de partición

projection.landing_time.range: NOW-2YEARS,NOW
projection.landing_time.type: date
projection.landing_time.interval: 1
projection.landing_time.interval.unit: HOURS
projection.landing_time.format: yyyy-MM-dd'%20'HH'%3A00%3A00.0'
projection.enabled: true

Veo que la proyección de partición permite derivaciones de rutas personalizadas usando la propiedad de la tabla: storage.location.template: s3://bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/

Pero no veo ninguna forma de personalizar el formato proyectado de las columnas de fecha, ¿hay alguna forma de hacerlo?

0
Golammott 10 feb. 2021 a las 05:12

2 respuestas

La mejor respuesta

Esto se puede resolver agregando una columna de partición adicional para manejar las horas y cambiar landing_time para manejar solo la parte de la fecha. Después de eso, cambiar storage.location.template para incluir los valores %20 y %3A codificados en URL me dio directamente el resultado deseado.

projection.landing_time.range: 2020-01-01,NOW
projection.landing_time.type: date
projection.landing_time.interval: 1
projection.landing_time.interval.unit: DAYS
projection.landing_time.format: yyyy-MM-dd
projection.hours.type: integer
projection.hours.range: 0,23
projection.hours.digits: 2
projection.enabled: true
storage.location.template: s3://bucket/table_root/landing_time=${landing_time}%20${hours}%3A00%3A00.0

Las consultas de Athena que utilizan la proyección de partición ahora se están ejecutando correctamente.

0
Golammott 10 feb. 2021 a las 16:07

Java DateTimeFormatter permite insertar cadenas personalizadas en el formato, por ejemplo, el texto The year is %20 YYYY se analizará en algo como The year is %20 2021. Es posible que deba especificar landing_time=yyyy-MM-dd'%20'HH'%3A00%3A00.0' como formato en lugar de solo yyyy-MM-dd'%20'HH'%3A00%3A00.0'

0
Nicolas Busca 10 feb. 2021 a las 04:17