Je souhaite utiliser la projection de partition Athena pour écrire des requêtes qui filtrent sur les colonnes de partition de date. Le problème est que le format de données physiques (emplacement des données S3) ne correspond à aucun des formats de date possibles autorisés pour les types de date dans la projection de partition Athena.

Mon format de données physiques dans S3 utilise des dates encodées en URL: s3://bucket/table_root/landing_time=yyyy-MM-dd%20HH%3Amm%3Ass.S'

Athena Query Ex:

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

Paramètres de table utilisés pour la projection de partition

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

Je vois que la projection de partition permet des dérivations de chemin personnalisées à l'aide de la propriété de table: storage.location.template: s3://bucket/table_root/a=${a}/${b}/some_static_subdirectory/${c}/

Mais je ne vois aucun moyen de personnaliser le format projeté des colonnes de date, existe-t-il un moyen de le faire?

0
Golammott 10 févr. 2021 à 05:12

2 réponses

Meilleure réponse

Cela peut être résolu en ajoutant une colonne de partition supplémentaire pour gérer les heures et en changeant landing_time pour ne gérer que la partie date. Après cela, changer storage.location.template pour inclure les valeurs encodées par URL %20 et %3A directement m'a donné le résultat souhaité.

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

Les requêtes Athena utilisant la projection de partition s'exécutent désormais correctement.

0
Golammott 10 févr. 2021 à 16:07

Le java DateTimeFormatter permet d'insérer des chaînes personnalisées au format, par exemple, le texte The year is %20 YYYY sera analysé en quelque chose comme The year is %20 2021. Vous devrez peut-être spécifier landing_time=yyyy-MM-dd'%20'HH'%3A00%3A00.0' comme format au lieu de seulement yyyy-MM-dd'%20'HH'%3A00%3A00.0'

0
Nicolas Busca 10 févr. 2021 à 04:17