Quatre nouvelles fonctions de sketch dans Databricks accélèrent les requêtes de percentiles, de comptes distincts et de top-K de plusieurs ordres de grandeur
par Daniel Tenedorio, Kent Marten, Gengliang Wang et Chenhao Li
De nombreuses questions analytiques relèvent du support décisionnel, pas de l'audit. Si savoir "~4,7 millions d'utilisateurs uniques ±1%" conduit à la même décision que "4 712 389 utilisateurs uniques", la réponse approximative à une fraction du coût est strictement meilleure.
Chaque entrepôt de données a une poignée de requêtes qui consomment le plus de calcul : les percentiles qui forcent des tris globaux, les comptages distincts qui suivent chaque valeur unique, les classements top-K qui re-mélangent des ensembles de données entiers. Databricks prend désormais en charge quatre nouvelles familles de fonctions d'esquisse, basées sur Apache DataSketches, qui remplacent ces calculs exacts par des approximations en mémoire limitée. Le compromis : une erreur relative configurable de 1 à 2 %. Le gain : des ordres de grandeur de calcul en moins, plus des esquisses que vous pouvez stocker, fusionner et requêter à nouveau sans toucher aux données brutes.
Lorsque vous appelez PERCENTILE(response_time_ms, 0.99) sur une table d'un milliard de lignes, le moteur doit trier chaque valeur globalement. Un mélange complet du cluster peut prendre des minutes et consommer des gigaoctets de mémoire. Pour un tableau de bord qui se rafraîchit toutes les 5 minutes, vous payez ce coût encore et encore.
Les esquisses KLL sont des résumés compacts et fusionnables, conçus pour répondre aux questions de quantiles. Elles vous permettent de remplacer ce tri tout en utilisant la même mémoire limitée, que vous traitiez un millier de valeurs ou un trillion. L'erreur relative typique est de 1 à 2 % et est configurable, bien dans la plage exploitable pour la surveillance de la latence, la planification de la capacité et la détection d'anomalies.
Le véritable avantage réside dans le flux de travail que permettent les esquisses. Construisez-les une fois pendant votre ETL quotidien. Stockez-les sous forme de colonnes dans des tables Delta. Lorsqu'un tableau de bord a besoin de P50/P90/P99 pour n'importe quelle plage de temps, fusionnez les esquisses pré-calculées en millisecondes au lieu de réanalyser les données brutes. Extrayez plusieurs quantiles d'une seule esquisse en une seule passe avec kll_get_quantile_bigint(sketch, ARRAY(0.5, 0.9, 0.99)).
Combien d'utilisateurs ont vu votre publicité du Super Bowl mais pas votre campagne Instagram ? L'analyse du chevauchement d'audience est essentielle à la mesure du marketing. Vous devez connaître la portée totale (utilisateurs ayant vu n'importe quelle campagne), le chevauchement (utilisateurs ayant vu plusieurs campagnes) et la portée exclusive (utilisateurs ayant vu une seule campagne). Mais le calcul exact nécessite de collecter chaque identifiant d'utilisateur en mémoire et d'effectuer des opérations sur des ensembles sur potentiellement des milliards d'identifiants. À grande échelle, cela devient impraticable ou impossible.
Les esquisses Theta résument un ensemble de valeurs distinctes en mémoire limitée et prennent en charge l'algèbre complète des ensembles : unions, intersections et différences. Construisez une esquisse par campagne, puis combinez-les mathématiquement :
L'approche exacte nécessiterait une UNION pour dédupliquer, puis une JOIN pour trouver le chevauchement, potentiellement en mélangeant les identifiants d'utilisateur bruts deux fois sur votre cluster. Avec les esquisses Theta, vous générez des objets binaires compacts mesurés en kilo-octets, et les opérations sur les ensembles se déroulent localement en microsecondes. Cela rend les courbes de portée quotidiennes, la mesure de l'incrémentalité et la déduplication inter-canaux pratiques.
Qu'est-ce qui est tendance en ce moment ? C'est une question simple avec une réponse exacte coûteuse : comptez chaque valeur distincte, stockez tous ces comptages, mélangez-les sur votre cluster, triez globalement. Pour les flux d'événements à haute cardinalité comme les journaux de recherche ou les flux de clics, il s'agit d'un travail par lots, pas d'une requête en direct.
Les esquisses Approximate Top-K suivent vos éléments les plus fréquents en mémoire limitée et vous permettent de fusionner entre les partitions et les fenêtres temporelles pour extraire les résultats instantanément. Les éléments rares peuvent être supprimés, ce qui est acceptable, car ce n'est pas ce que vous recherchez.
Avec approx_top_k_combine, votre tableau de bord "tendance de la semaine" devient une fusion de 168 esquisses pré-calculées plutôt qu'une analyse de milliards d'événements bruts. Pour les charges de travail de streaming, fusionnez l'esquisse de chaque micro-lot dans un total courant et affichez les résultats en temps réel. Ce qui était autrefois un travail par lots devient un classement en direct.
Compter les clients uniques est une requête. Sommer leurs revenus en est une autre. Faire les deux correctement, sans compter deux fois les clients qui apparaissent dans plusieurs périodes, est le défi.
Considérez une question analytique courante : "Combien de clients uniques ont effectué un achat ce mois-ci, et quel a été leur revenu total par région ?" Généralement, vous commenceriez par un grand GROUP BY, en dédupliquant les identifiants clients tout en sommant les achats sur des milliards de transactions. Et vous ne pouvez pas simplement ajouter les résultats précédents ensemble, les clients apparaissant dans les deux périodes sont comptés deux fois et leurs revenus surestimés.
Les esquisses Tuple résolvent ce problème en combinant le comptage distinct et l'agrégation de métriques dans une structure unique et fusionnable.
Chaque esquisse associe un client distinct à ses dépenses agrégées. Lorsque vous fusionnez sur plusieurs jours, les comptages de clients sont dédupliqués automatiquement et les sommes de revenus s'accumulent. Un calcul incrémental exact vous obligerait à retraiter à partir des données brutes chaque fois que la plage de données changerait.
Famille de fonctions | Cas d'utilisation |
Esquisses de quantiles KLL | Percentiles (P50, P90, P99) |
Esquisses Theta | Opérations sur ensembles de valeurs distinctes |
Approximate Top-K | Éléments les plus fréquents |
Esquisses Tuple | Comptages distincts et agrégations de métriques |
Quand utiliser les esquisses : Tableaux de bord, analyse de tendances, surveillance, attribution marketing -- toute requête pour laquelle des réponses approximatives sont acceptables. Plus votre jeu de données est volumineux, mieux c'est. Si vous n'êtes pas sûr de l'esquisse à utiliser, demandez à Genie Code de vous aider à faire le bon choix.
Quand rester exact : Audit financier, rapports de conformité, ou tout cas d'utilisation où les exigences réglementaires ou commerciales exigent des valeurs précises.
Ces quatre familles de fonctions transforment les requêtes de longue durée en les moins chères de votre entrepôt. Construisez des esquisses une fois pendant l'ETL, stockez-les dans Delta, fusionnez-les à la lecture. Les données brutes sont toujours là lorsque les auditeurs le demandent. Pour tout le reste, une marge d'erreur de 1 % et une accélération de 1000x sont un compromis bienvenu.
Toutes les fonctions fonctionnent dans les pipelines SQL, DataFrame et Structured Streaming. Les esquisses créées dans Spark sont interopérables avec d'autres systèmes de l'écosystème Apache DataSketches. Consultez la documentation (1, 2, 3, 4) pour les signatures de fonctions et les exemples, et commencez dès aujourd'hui avec les esquisses.
Mention spéciale à Christopher Boumalhab (cboumalh sur GitHub) pour l'implémentation et la contribution des familles de fonctions Theta sketch et Tuple sketch dans Apache Spark.
(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original
Abonnez-vous à notre blog et recevez les derniers articles directement dans votre boîte mail.