Trois outils de débogage sont disponibles, classés du plus léger au plus complet :
Visualiser le plan d'exécution — observez comment PyODPS optimise et fusionne vos opérations avant l'exécution
Inspecter le code SQL compilé — vérifiez le code SQL généré par PyODPS pour le backend MaxCompute SQL
Exécuter localement avec pandas — téléchargez un petit échantillon et itérez rapidement sans planifier de tâche MaxCompute
Visualiser le plan d'exécution
La visualisation du plan d'exécution avant de lancer un calcul vous aide à identifier les opérations fusionnées en une seule étape ainsi que les limites explicites entre les étapes. Cette approche révèle les goulots d'étranglement potentiels, tels que les opérations impossibles à paralléliser, avant qu'ils n'affectent les tâches de production.
Prérequis : Installez graphviz et le package Python graphviz.
Appelez .visualize() sur n'importe quel DataFrame pour afficher son graphe de calcul.
Exemple : opérations fusionnées en une seule étape
Lorsqu'aucune limite de cache ne sépare les opérations, PyODPS les combine automatiquement :
>>> df = iris.groupby('name').agg(id=iris.sepalwidth.sum())
>>> df = df[df.name, df.id + 3]
>>> df.visualize()

Le graphe indique que PyODPS fusionne les opérations groupby et de filtrage des colonnes en une seule étape.
Exemple : opérations réparties sur deux étapes
L'insertion de .cache() entre les opérations impose une limite d'étape :
>>> df = iris.groupby('name').agg(id=iris.sepalwidth.sum()).cache()
>>> df2 = df[df.name, df.id + 3]
>>> df2.visualize()

Le graphe affiche désormais deux étapes, car l'appel à .cache() crée une limite d'exécution explicite. La comparaison de ces deux graphes permet de déterminer clairement où se produisent les séparations d'étapes et où la fusion est possible.
Inspecter le code SQL compilé
Appelez .compile() pour afficher le code SQL généré par PyODPS pour le backend MaxCompute SQL. Utilisez cette fonction pour vérifier que la requête générée correspond à votre intention avant de soumettre une tâche.
>>> df = iris.groupby('name').agg(sepalwidth=iris.sepalwidth.max())
>>> df.compile()
Stage 1:
SQL compiled:
SELECT
t1.`name`,
MAX(t1.`sepalwidth`) AS `sepalwidth`
FROM test_pyodps_dev.`pyodps_iris` t1
GROUP BY
t1.`name`
Exécuter localement avec pandas
Pour accélérer les itérations, téléchargez un petit échantillon de données depuis MaxCompute et exécutez-le via le backend de calcul pandas. PyODPS utilisant le service MaxCompute Tunnel pour télécharger les données directement, cette méthode contourne entièrement le planificateur du backend MaxCompute SQL, ce qui élimine les temps d'attente liés à la planification des tâches.
Les opérations suivantes déclenchent un téléchargement via Tunnel au lieu d'une tâche MaxCompute SQL :
Table non partitionnée : sélectionnez toutes ou certaines lignes, filtrez les colonnes ou comptez les lignes. Le filtrage des colonnes ne calcule pas les valeurs des colonnes.
>>> iris.count()
>>> iris['name', 'sepalwidth'][:10]
Table partitionnée : sélectionnez des lignes à partir de toutes ou des premières colonnes de partition, filtrez les colonnes ou comptez les lignes.
>>> df[:10]
>>> df[df.ds == '20160808']['f0', 'f1']
>>> df[(df.ds == '20160808') & (df.hh == 3)][:10]
>>> df[(df.ds == '20160808') & (df.hh == 3) & (df.mm == 15)]
Basculer entre le mode local et le mode production
Utilisez un indicateur DEBUG pour basculer entre l'exécution locale avec pandas et l'exécution complète sur MaxCompute :
>>> DEBUG = True
>>> if DEBUG:
>>> df = iris[:100].to_pandas(wrap=True)
>>> else:
>>> df = iris
Définissez DEBUG = True pendant le développement pour télécharger les données localement. Définissez DEBUG = False avant l'exécution en production pour lancer le calcul complet sur MaxCompute.
L'exécution locale et l'exécution sur MaxCompute ne sont pas équivalentes. Certains programmes qui passent avec succès le débogage local peuvent échouer sur MaxCompute en raison des restrictions du sandbox. Testez toujours dans l'environnement de production avant de vous fier aux résultats locaux.