Pourquoi les FDU conduisent à des produits cartésiens dans les requêtes SQL
Lors de l'utilisation de SQL, les fonctions définies par l'utilisateur (FDU) peuvent introduire des problèmes de performances inattendus. Cela est particulièrement évident dans les opérations de jointure, où les FDU peuvent conduire à des produits cartésiens au lieu de la jointure externe complète souhaitée.
Cause des produits cartésiens
L'utilisation des FDU nécessite l'évaluation de fonctions arbitraires avec des domaines potentiellement infinis et un comportement non déterministe. Pour déterminer la valeur de ces fonctions, le système doit considérer toutes les combinaisons d'arguments possibles, aboutissant à un produit cartésien.
Exemple
Considérez les requêtes SQL fournies dans le fichier donné Databricks-Question :
-- Query 1: Join without UDF SELECT col1, col2 FROM table1 AS t1 JOIN table2 AS t2 ON t1.foo = t2.bar; -- Query 2: Join with UDF SELECT col1, col2 FROM table1 AS t1 JOIN table2 AS t2 ON equals(t1.foo, t2.bar);
Dans la requête 1, la simple condition d'égalité permet le brassage des données en fonction du foo et des colonnes à barres, produisant le résultat attendu. Cependant, dans la requête 2, l'utilisation de la fonction UDF égale nécessite d'évaluer la fonction pour toutes les combinaisons de paires possibles, ce qui donne un produit cartésien.
Solution
Forcer une valeur externe la jointure sur un produit cartésien n'est généralement pas possible sans modifier le moteur Spark SQL. Cependant, l'optimisation de l'UDF elle-même pour réduire le nombre d'évaluations pourrait atténuer une partie de la dégradation des performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!