dbt-utils inclut trois macros de parsing d’URL qui sont étonnamment utiles dans le travail d’analytics marketing et web. La plupart des plateformes analytics transmettent les URLs brutes dans leurs exports de données, et extraire des composants structurés (hôte, chemin, paramètres UTM) est du SQL répétitif qui varie selon l’entrepôt. Ces macros le standardisent.
Les trois macros
get_url_host(field) extrait le nom d’hôte depuis une URL. Elle gère les protocoles http://, https:// et android-app:// et supprime le préfixe de protocole, retournant juste le domaine :
{{ dbt_utils.get_url_host('page__url') }} AS page__host-- 'https://example.com/blog/post' → 'example.com'get_url_path(field) extrait le chemin de la page — tout ce qui se trouve entre le nom d’hôte et la chaîne de requête :
{{ dbt_utils.get_url_path('page__url') }} AS page__path-- 'https://example.com/blog/post?utm_source=email' → '/blog/post'get_url_parameter(field, url_parameter) extrait la valeur d’un paramètre de requête spécifique :
{{ dbt_utils.get_url_parameter('page__url', 'utm_source') }} AS session__utm_sourceEn pratique, vous utiliserez les trois ensemble dans un modèle de la couche base qui normalise une colonne URL brute en composants structurés :
SELECT session__id, page__url, {{ dbt_utils.get_url_host('page__url') }} AS page__host, {{ dbt_utils.get_url_path('page__url') }} AS page__path, {{ dbt_utils.get_url_parameter('page__url', 'utm_source') }} AS session__utm_source, {{ dbt_utils.get_url_parameter('page__url', 'utm_medium') }} AS session__utm_medium, {{ dbt_utils.get_url_parameter('page__url', 'utm_campaign') }} AS session__utm_campaign, {{ dbt_utils.get_url_parameter('page__url', 'utm_content') }} AS session__utm_content, {{ dbt_utils.get_url_parameter('page__url', 'utm_term') }} AS session__utm_termFROM {{ ref('base__ga4__events') }}WHERE event__name = 'session_start'Où cela intervient
Les exports BigQuery de GA4 incluent les URLs de page brutes dans event_params. Extraire les paramètres UTM de ces URLs en SQL est la manière standard de construire des colonnes d’attribution au niveau session. Le même pattern s’applique à toute plateforme analytics qui transmet des URLs de référent ou des URLs de page de destination.
Pour l’attribution spécifique aux plateformes publicitaires — où les UTMs sont votre principal mécanisme de suivi des performances des campagnes — voir Nommage des campagnes et standardisation des UTM pour la manière dont des conventions UTM standardisées interagissent avec cette étape d’extraction.
Ce que ces macros ne gèrent pas
Quelques limitations à connaître :
Encodage d’URL. Les macros ne décodent pas les caractères encodés en URL (%20 → espace, %2B → +, etc.). Si vos valeurs UTM contiennent des caractères spéciaux qui sont encodés en URL, vous obtiendrez la forme encodée dans votre sortie.
URLs malformées. Pas de gestion gracieuse des URLs sans protocole, des chemins relatifs ou d’autres entrées malformées. Les macros retourneront des nulls ou des chaînes inattendues pour une mauvaise entrée plutôt que des erreurs.
Identifiants de fragment. La portion #fragment d’une URL n’est pas gérée.
Pour la plupart des cas d’usage analytics — exports GA4, suivi des pages de destination, parsing des référents — ces contraintes n’ont pas d’importance. Si vous construisez une couche de parsing d’URL de niveau production avec des exigences de qualité de données d’entreprise, vous pourriez avoir besoin de fonctions regex spécifiques à l’entrepôt pour la gestion des cas limites.
Helpers de développement Jinja
dbt-utils inclut aussi quelques utilitaires Jinja qui apparaissent occasionnellement pendant le développement de macros :
log_info(message)— affiche un message dans la console pendant la compilation. Utile pour déboguer les variables de macro.pretty_time(format)— retourne une chaîne de timestamp formatée. L’argumentformatutilise les codes de format Pythonstrftime.slugify(string)— convertit du texte en slug compatible URL (minuscules, tirets, sans caractères spéciaux).
Ce sont des utilitaires de macro, pas des générateurs SQL — ils produisent une sortie Jinja, pas du SQL. Vous ne les appelleriez pas dans la clause SELECT d’un modèle. Ce sont des outils pour quand vous construisez ou déboguez d’autres macros.