Cette rubrique décrit les méthodes d'exécution disponibles pour les opérations DataFrame.
Prérequis
Vérifiez que les conditions suivantes sont remplies :
Une table d'exemple nommée pyodps_iris est prête. Pour plus d'informations, consultez la section Traitement des données DataFrame.
Un objet DataFrame est créé. Pour plus d'informations, consultez la section « Créer un objet DataFrame à partir d'une table MaxCompute » dans Créer un objet DataFrame.
Exécution différée
Les opérations DataFrame ne s'exécutent que lorsque vous appelez explicitement la méthode execute ou lorsque vous invoquez des méthodes qui appellent implicitement execute. Le tableau suivant répertorie les méthodes qui déclenchent l'exécution.
Méthode | Description | Valeur de retour |
persist | Enregistre les résultats d'exécution dans des tables MaxCompute. | PyODPS DataFrame |
execute | Exécute les opérations et renvoie tous les résultats. | ResultFrame |
head | Exécute les opérations et renvoie les N premières lignes des données de résultat. | ResultFrame |
tail | Exécute les opérations et renvoie les N dernières lignes des données de résultat. | ResultFrame |
to_pandas | Convertit un objet Collection en objet pandas DataFrame ou un objet Sequence en objet Series. Si le paramètre wrap est défini sur True, un objet PyODPS DataFrame est renvoyé. |
|
plot, hist et boxplot | Méthodes de tracé. | N/A |
Dans un environnement interactif, PyODPS DataFrame appelle automatiquement la méthode execute lors de l'affichage des données de résultat ou de l'appel à la méthode repr. Vous n'avez pas besoin d'appeler manuellement la méthode execute.
Exemples
# In a non-interactive environment, you need to manually call the execute method.
print(iris[iris.sepallength < 5][:5].execute())
# In an interactive environment, the system automatically calls the execute method.
print(iris[iris.sepallength < 5][:5])
Le résultat suivant s'affiche :
sepallength sepalwidth petallength petalwidth name
0 4.9 3.0 1.4 0.2 Iris-setosa
1 4.7 3.2 1.3 0.2 Iris-setosa
2 4.6 3.1 1.5 0.2 Iris-setosa
3 4.6 3.4 1.4 0.3 Iris-setosa
4 4.4 2.9 1.4 0.2 Iris-setosa
Pour empêcher le système d'appeler automatiquement la méthode execute dans un environnement interactif, effectuez les opérations manuelles suivantes. L'exemple de code ci-dessous illustre cette procédure :
from odps import options
options.interactive = False
print(iris[iris.sepallength < 5][:5])
Le résultat suivant s'affiche :
Collection: ref_0
odps.Table
name: hudi_mc_0612.`iris3`
schema:
sepallength : double # Sepal length (cm)
sepalwidth : double # Sepal width (cm)
petallength : double # Petal length (cm)
petalwidth : double # Petal width (cm)
name : string # Type
Collection: ref_1
Filter[collection]
collection: ref_0
predicate:
Less[sequence(boolean)]
sepallength = Column[sequence(float64)] 'sepallength' from collection ref_0
Scalar[int8]
5
Slice[collection]
collection: ref_1
stop:
Scalar[int8]
5
Après avoir désactivé les appels automatiques, l'intégralité de l'arbre syntaxique abstrait (AST) s'affiche lors de l'appel à repr. Dans ce cas, vous devez appeler manuellement la méthode execute si vous souhaitez obtenir les résultats.
Récupérer les résultats d'exécution
Si un ResultFrame est renvoyé après l'appel de la méthode execute ou head, vous pouvez extraire les résultats depuis le ResultFrame.
Un ResultFrame est un ensemble de résultats et ne peut pas être utilisé dans des calculs ultérieurs.
-
Parcourez itérativement tous les enregistrements du ResultFrame. L'exemple de code ci-dessous illustre cette procédure :
result = iris.head(3) for r in result: print(list(r))Le résultat suivant s'affiche :
[4.9, 3.0, 1.4, 0.2, 'Iris-setosa'] [4.7, 3.2, 1.3, 0.2, 'Iris-setosa'] [4.6, 3.1, 1.5, 0.2, 'Iris-setosa'] -
Si pandas est installé, convertissez un ResultFrame en pandas DataFrame ou en PyODPS DataFrame utilisant le backend pandas.
# Return a pandas DataFrame. pd_df = iris.head(3).to_pandas() # Return a PyODPS DataFrame that uses the pandas backend. wrapped_df = iris.head(3).to_pandas(wrap=True)
Enregistrer les résultats dans des tables MaxCompute
-
Appelez la méthode
persistpour renvoyer un nouvel objet DataFrame pour un objet Collection. La méthodepersistutilise le nom de la table comme paramètre.iris2 = iris[iris.sepalwidth < 2.5].persist('pyodps_iris') print(iris2.head(5))Le résultat suivant s'affiche :
sepallength sepalwidth petallength petalwidth name 0 4.5 2.3 1.3 0.3 Iris-setosa 1 5.5 2.3 4.0 1.3 Iris-versicolor 2 4.9 2.4 3.3 1.0 Iris-versicolor 3 5.0 2.0 3.5 1.0 Iris-versicolor 4 6.0 2.2 4.0 1.0 Iris-versicolor -
Spécifiez le paramètre
partitionsdans la méthodepersistpour créer une table partitionnée. La table est partitionnée selon les colonnes spécifiées parpartitions.iris3 = iris[iris.sepalwidth < 2.5].persist('pyodps_iris_test', partitions=['name']) print(iris3.data)Le résultat suivant s'affiche :
odps.Table name: odps_test_sqltask_finance.`pyodps_iris` schema: sepallength : double sepalwidth : double petallength : double petalwidth : double partitions: name : string -
Pour écrire des données dans une partition d'une table existante, spécifiez le paramètre
partitiondans la méthodepersist. Le paramètrepartitionindique la partition cible. Par exemple, définissez le paramètrepartitionsurds=******. La table doit contenir toutes les colonnes de l'objet DataFrame avec les mêmes types. Les paramètresdrop_partitionetcreate_partitionne sont valides que si le paramètrepartitionest spécifié. Le paramètredrop_partitionindique s'il faut supprimer la partition spécifiée si elle existe. Le paramètrecreate_partitionindique s'il faut créer la partition spécifiée si elle n'existe pas.print(iris[iris.sepalwidth < 2.5].persist('pyodps_iris_partition', partition='ds=test', drop_partition=True, create_partition=True).head(5))Le résultat suivant s'affiche :
sepallength sepalwidth petallength petalwidth name ds 0 4.5 2.3 1.3 0.3 Iris-setosa test 1 5.5 2.3 4.0 1.3 Iris-versicolor test 2 4.9 2.4 3.3 1.0 Iris-versicolor test 3 5.0 2.0 3.5 1.0 Iris-versicolor test 4 6.0 2.2 4.0 1.0 Iris-versicolor test -
Lors de l'écriture des données dans une table, vous pouvez spécifier la durée de vie (TTL) de la table. Par exemple, l'instruction suivante définit la TTL de la table sur 10 jours.
print(iris[iris.sepalwidth < 2.5].persist('pyodps_iris', lifecycle=10).head(5))Le résultat suivant s'affiche :
sepallength sepalwidth petallength petalwidth name 0 4.5 2.3 1.3 0.3 Iris-setosa 1 5.5 2.3 4.0 1.3 Iris-versicolor 2 4.9 2.4 3.3 1.0 Iris-versicolor 3 5.0 2.0 3.5 1.0 Iris-versicolor 4 6.0 2.2 4.0 1.0 Iris-versicolor -
Si la source de données ne contient pas d'objets MaxCompute mais uniquement des objets pandas, spécifiez manuellement l'objet d'entrée MaxCompute ou marquez-le comme objet global lors de l'appel à la méthode
persist.# The entrance object is o. # Specify the entrance object. df.persist('table_name', odps=o) # Alternative operation: Mark the entrance object as a global object. o.to_global() df.persist('table_name')
Enregistrer les résultats dans un pandas DataFrame
Appelez la méthode to_pandas pour enregistrer les résultats dans un objet pandas DataFrame. Si le paramètre wrap est défini sur True, un objet PyODPS DataFrame est renvoyé.
-
Exemple 1 : Appelez la méthode
to_pandaspour renvoyer un objet pandas DataFrame.print(type(iris[iris.sepalwidth < 2.5].to_pandas()))Le résultat suivant s'affiche :
<class 'pandas.core.frame.DataFrame'> -
Exemple 2 : Définissez le paramètre
wrapsur True pour renvoyer un objet PyODPS DataFrame.print(type(iris[iris.sepalwidth < 2.5].to_pandas(wrap=True)))Le résultat suivant s'affiche :
<class 'odps.df.core.DataFrame'>
Vous pouvez appeler la méthode open_reader dans PyODPS et utiliser reader.to_pandas() pour convertir les résultats en objet pandas DataFrame. Pour plus d'informations, consultez la section Tables.
Configurer les paramètres d'exécution
Configurez les paramètres d'exécution pour les méthodes exécutées immédiatement, telles que execute, persist et to_pandas. Ce paramétrage n'est valide que pour le backend MaxCompute SQL.
Configurez les paramètres globaux. Pour plus d'informations, consultez la section SQL.
-
Spécifiez le paramètre
hintsdans ces méthodes. Cela garantit que les paramètres d'exécution spécifiés ne s'appliquent qu'au calcul en cours.print(iris[iris.sepallength < 5].to_pandas(hints={'odps.sql.mapper.split.size': 16}))Le résultat suivant s'affiche :
sepallength sepalwidth petallength petalwidth name 0 4.5 2.3 1.3 0.3 Iris-setosa 1 4.9 2.4 3.3 1.0 Iris-versicolor
Afficher les détails au moment de l'exécution
-
Pour afficher les informations LogView d'une instance au moment de l'exécution, modifiez les configurations globales. L'exemple de code ci-dessous illustre cette procédure :
from odps import options options.verbose = True print(iris[iris.sepallength < 5].exclude('sepallength')[:5].execute())Le résultat suivant s'affiche :
Sql compiled: SELECT t1.`sepalwidth`, t1.`petallength`, t1.`petalwidth`, t1.`name` FROM odps_test_sqltask_finance.`pyodps_iris` t1 WHERE t1.`sepallength` < 5 LIMIT 5 Instance ID: Log view:http://logview sepalwidth petallength petalwidth name 0 2.3 1.3 0.3 Iris-setosa 1 2.4 3.3 1.0 Iris-versicolor -
Spécifiez une fonction de journalisation. L'exemple de code ci-dessous illustre cette procédure :
my_logs = [] def my_logger(x): my_logs.append(x) options.verbose_log = my_logger print(iris[iris.sepallength < 5].exclude('sepallength')[:5].execute()) print(my_logs)Le résultat suivant s'affiche :
sepalwidth petallength petalwidth name 0 2.3 1.3 0.3 Iris-setosa 1 2.4 3.3 1.0 Iris-versicolor ['Sql compiled:', 'CREATE TABLE tmp_pyodps_24332bdb_4fd0_4d0d_aed4_38a443618268 LIFECYCLE 1 AS \nSELECT t1.`sepalwidth`, t1.`petallength`, t1.`petalwidth`, t1.`name` \nFROM odps_test_sqltask_finance.`pyodps_iris` t1 \nWHERE t1.`sepallength` < 5 \nLIMIT 5', 'Instance ID: 20230815034706122gbymevg*****', ' Log view:]
Mettre en cache les résultats de calcul intermédiaires des objets Collection
Au cours du processus de calcul DataFrame, certains objets Collection sont utilisés plusieurs fois. Pour afficher les résultats d'exécution d'un processus intermédiaire, appelez la méthode cache pour marquer un objet Collection à calculer en priorité. L'exemple de code ci-dessous illustre cette procédure.
L'exécution de la méthode cache est différée. L'appel à la méthode cache ne déclenche pas immédiatement le calcul automatique.
cached = iris[iris.sepalwidth < 3.5]['sepallength', 'name'].cache()
df = cached.head(3)
print(df)
# The following result is returned:
sepallength name
0 4.5 Iris-setosa
1 5.5 Iris-versicolor
2 4.9 Iris-versicolor
# You can immediately retrieve the calculation result because cached is calculated.
print(cached.head(3))
# The following result is returned:
sepallength name
0 4.5 Iris-setosa
1 5.5 Iris-versicolor
2 4.9 Iris-versicolor
Exécution asynchrone et parallèle
Exécution asynchrone
PyODPS DataFrame prend en charge l'exécution asynchrone. Spécifiez le paramètre async pour activer l'exécution asynchrone pour les méthodes exécutées immédiatement suivantes : execute, persist, head, tail et to_pandas. Le paramètre timeout spécifie le délai d'expiration. Les opérations asynchrones renvoient des objets Future.
future = iris[iris.sepalwidth < 10].head(10, async_=True)
print(future.result())
# The following result is returned:
sepallength sepalwidth petallength petalwidth name
0 4.5 2.3 1.3 0.3 Iris-setosa
1 5.5 2.3 4.0 1.3 Iris-versicolor
2 4.9 2.4 3.3 1.0 Iris-versicolor
3 5.0 2.0 3.5 1.0 Iris-versicolor
4 6.0 2.2 4.0 1.0 Iris-versicolor
5 6.2 2.2 4.5 1.5 Iris-versicolor
6 5.5 2.4 3.8 1.1 Iris-versicolor
7 5.5 2.4 3.7 1.0 Iris-versicolor
8 6.3 2.3 4.4 1.3 Iris-versicolor
9 5.0 2.3 3.3 1.0 Iris-versicolor
Exécution parallèle
Appelez l'opération Delay API récemment introduite pour différer les méthodes exécutées immédiatement suivantes : execute, persist, head, tail et to_pandas. Des objets Future sont alors renvoyés. Lors de l'appel à l'opération Delay API, le système identifie les dépendances et exécute les méthodes selon le niveau de concurrence spécifié. Dans ce cas, l'exécution asynchrone est prise en charge.
from odps.df import Delay
delay = Delay() # Create a Delay object.
df = iris[iris.sepal_width < 5].cache() # Common dependency of subsequent expressions.
future1 = df.sepal_width.sum().execute(delay=delay) # Return a Future object. The execution is not started.
future2 = df.sepal_width.mean().execute(delay=delay)
future3 = df.sepal_length.max().execute(delay=delay)
delay.execute(n_parallel=3) # The execution starts with three concurrent threads.
|==========================================| 1 / 1 (100.00%) 21s
print(future1.result())
# The following result is returned:
25.0
print(future2.result())
# The following result is returned:
2.272727272727273
Dans l'exemple précédent, PyODPS DataFrame exécute d'abord l'objet de la dépendance partagée. Ensuite, PyODPS DataFrame définit la concurrence sur 3 et exécute les objets de future1 à future3.
Spécifiez le paramètre async dans delay.execute pour indiquer s'il faut activer l'exécution asynchrone. Si l'exécution asynchrone est activée, vous pouvez également utiliser le paramètre timeout pour spécifier le délai d'expiration.