UDF dans les requêtes SQL et les produits cartésiens
L'utilisation de fonctions définies par l'utilisateur (UDF) dans les requêtes SQL peut conduire à un produit cartésien au lieu de la jointure externe complète prévue. Un produit cartésien se produit lorsque toutes les lignes d'une table sont combinées avec toutes les lignes d'une autre table, ce qui donne un ensemble de données beaucoup plus volumineux qu'une jointure externe complète.
Pourquoi une UDF provoque-t-elle un produit cartésien ?
Les UDF introduisent un niveau de complexité supplémentaire qui empêche l'optimisation par le moteur de requête. Une UDF peut accepter n'importe quel nombre d'arguments avec un comportement non déterministe. Pour évaluer l'UDF pour toutes les combinaisons possibles de lignes, le moteur de requête doit effectuer un produit cartésien.
En revanche, une simple comparaison d'égalité entre les colonnes (par exemple, t1.foo = t2.bar) a un comportement prévisible . Le moteur de requête peut utiliser cela pour optimiser la jointure en mélangeant les lignes en fonction des colonnes foo et bar, évitant ainsi le besoin d'un produit cartésien.
Application des jointures externes
Malheureusement, il n'existe aucun moyen simple de forcer une jointure externe sur un produit cartésien dans l'exemple ci-dessus. La seule option serait de modifier le moteur Spark SQL.
Comme expliqué ci-dessus, le produit cartésien est une conséquence de la nature arbitraire et non déterministe des UDF. Le moteur de requêtes ne peut pas les optimiser sans introduire des contraintes supplémentaires.
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!