Este tema describe los métodos de ejecución disponibles para las operaciones de DataFrame.
Requisitos previos
Asegúrese de cumplir con los siguientes requisitos:
Debe contar con una tabla de ejemplo llamada pyodps_iris. Para más información, consulte DataFrame data processing.
Debe haber creado un objeto DataFrame. Para más información, consulte la sección "Crear un objeto DataFrame a partir de una tabla de MaxCompute" en Create a DataFrame object.
Ejecución diferida
Las operaciones de DataFrame se ejecutan únicamente cuando se invoca explícitamente el método execute o cuando se llaman métodos que internamente invocan a execute. La siguiente tabla enumera los métodos que llaman internamente al método execute.
Método | Descripción | Valor de retorno |
persist | Guarda los resultados de la ejecución en tablas de MaxCompute. | PyODPS DataFrame |
execute | Ejecuta las operaciones y devuelve todos los resultados. | ResultFrame |
head | Ejecuta las operaciones y devuelve las primeras N filas de datos resultantes. | ResultFrame |
tail | Ejecuta las operaciones y devuelve las últimas N filas de datos resultantes. | ResultFrame |
to_pandas | Convierte un objeto Collection en un objeto pandas DataFrame, o bien convierte un objeto Sequence en un objeto Series. Si el parámetro wrap se establece en True, se devuelve un objeto PyODPS DataFrame. |
|
plot, hist y boxplot | Métodos de graficación. | N/A |
En un entorno interactivo, PyODPS DataFrame llama automáticamente al método execute cuando muestra datos de resultados o cuando invoca el método repr. No es necesario llamar manualmente al método execute.
Ejemplos
# 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])
Se obtiene el siguiente resultado:
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
Si necesita evitar que el sistema llame automáticamente al método execute en un entorno interactivo, debe realizar una configuración manual. El siguiente código muestra un ejemplo:
from odps import options
options.interactive = False
print(iris[iris.sepallength < 5][:5])
Se obtiene el siguiente resultado:
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
Al deshabilitar las llamadas automáticas, se muestra el árbol de sintaxis abstracta (AST) completo cuando se visualiza el objeto repr. En este caso, debe llamar manualmente al método execute si requiere utilizarlo.
Obtener resultados de ejecución
Si tras invocar el método execute o head se devuelve un objeto ResultFrame, puede recuperar los resultados desde dicho ResultFrame.
Un ResultFrame es un conjunto de resultados y no puede utilizarse en cálculos posteriores.
-
Puede recuperar iterativamente todos los registros del ResultFrame. El siguiente código muestra un ejemplo:
result = iris.head(3) for r in result: print(list(r))Se obtiene el siguiente resultado:
[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á instalado, un ResultFrame puede convertirse en un pandas DataFrame o en un PyODPS DataFrame que utilice el backend de 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)
Guardar resultados en tablas de MaxCompute
-
Puede llamar al método
persistpara devolver un nuevo objeto DataFrame correspondiente a un objeto Collection. El método persist utiliza el nombre de la tabla como parámetro.iris2 = iris[iris.sepalwidth < 2.5].persist('pyodps_iris') print(iris2.head(5))Se obtiene el siguiente resultado:
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 -
Puede especificar el parámetro
partitionsen el métodopersistpara crear una tabla particionada. La tabla se particiona según las columnas indicadas porpartitions.iris3 = iris[iris.sepalwidth < 2.5].persist('pyodps_iris_test', partitions=['name']) print(iris3.data)Se obtiene el siguiente resultado:
odps.Table name: odps_test_sqltask_finance.`pyodps_iris` schema: sepallength : double sepalwidth : double petallength : double petalwidth : double partitions: name : string -
Para escribir datos en una partición de una tabla existente, especifique el parámetro
partitionen el métodopersist. Este parámetro indica la partición destino de la escritura. Por ejemplo, establezca el parámetro partition comods=******. La tabla debe contener todas las columnas del objeto DataFrame y estas deben ser del mismo tipo. Los parámetrosdrop_partitionycreate_partitionsolo son válidos si se especifica el parámetro partition. El parámetro drop_partition determina si se elimina la partición indicada en caso de que ya exista. El parámetro create_partition determina si se crea la partición indicada en caso de que no exista.print(iris[iris.sepalwidth < 2.5].persist('pyodps_iris_partition', partition='ds=test', drop_partition=True, create_partition=True).head(5))Se obtiene el siguiente resultado:
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 -
Al escribir datos en una tabla, puede definir su tiempo de vida (TTL). Por ejemplo, la siguiente instrucción establece el TTL de la tabla en 10 días.
print(iris[iris.sepalwidth < 2.5].persist('pyodps_iris', lifecycle=10).head(5))Se obtiene el siguiente resultado:
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 el origen de datos no contiene objetos de MaxCompute y solo incluye objetos de pandas, debe especificar manualmente el objeto de entrada de MaxCompute o marcarlo como objeto global al invocar el método
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')
Guardar resultados en un pandas DataFrame
Puede llamar al método to_pandas para guardar los resultados en un objeto pandas DataFrame. Si el parámetro wrap se establece en True, se devuelve un objeto PyODPS DataFrame.
-
Ejemplo 1: Llame al método
to_pandaspara devolver un objeto pandas DataFrame.print(type(iris[iris.sepalwidth < 2.5].to_pandas()))Se obtiene el siguiente resultado:
<class 'pandas.core.frame.DataFrame'> -
Ejemplo 2: Establezca el parámetro
wrapen True para devolver un objeto PyODPS DataFrame.print(type(iris[iris.sepalwidth < 2.5].to_pandas(wrap=True)))Se obtiene el siguiente resultado:
<class 'odps.df.core.DataFrame'>
Puede llamar al método open_reader en PyODPS y usar reader.to_pandas() para convertir los resultados en un objeto pandas DataFrame. Para más información, consulte Tables.
Configurar parámetros de tiempo de ejecución
Es posible configurar los parámetros de tiempo de ejecución para métodos de ejecución inmediata, tales como execute, persist y to_pandas. Esta configuración solo aplica al backend de MaxCompute SQL.
Configure los parámetros globales. Para más información, consulte SQL.
-
Especifique el parámetro
hintsen estos métodos. Esto garantiza que los parámetros de tiempo de ejecución indicados sean válidos únicamente para el cálculo actual.print(iris[iris.sepallength < 5].to_pandas(hints={'odps.sql.mapper.split.size': 16}))Se obtiene el siguiente resultado:
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
Mostrar detalles durante la ejecución
-
Para consultar la información de LogView de una instancia durante la ejecución, debe modificar las configuraciones globales. El siguiente código muestra un ejemplo:
from odps import options options.verbose = True print(iris[iris.sepallength < 5].exclude('sepallength')[:5].execute())Se obtiene el siguiente resultado:
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 -
Puede especificar una función de registro. El siguiente código muestra un ejemplo:
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)Se obtiene el siguiente resultado:
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:]
Almacenar en caché resultados intermedios de objetos Collection
Durante el proceso de cálculo de DataFrame, algunos objetos Collection se utilizan varias veces. Para ver los resultados de ejecución de un proceso intermedio, puede llamar al método cache para marcar un objeto Collection que desea calcular primero. El siguiente código muestra un ejemplo.
La ejecución del método cache es diferida. No se desencadena un cálculo automático inmediatamente después de invocar el método cache.
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
Ejecución asíncrona y paralela
Ejecución asíncrona
PyODPS DataFrame admite la ejecución asíncrona. Puede especificar el parámetro async para habilitar la ejecución asíncrona en los siguientes métodos de ejecución inmediata: execute, persist, head, tail y to_pandas. El parámetro timeout define el periodo de tiempo de espera. Las operaciones asíncronas devuelven objetos 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
Ejecución paralela
Puede utilizar la nueva operación Delay API para diferir los siguientes métodos de ejecución inmediata: execute, persist, head, tail y to_pandas. Posteriormente, se devuelven objetos Future. Cuando se invoca la operación Delay API, el sistema identifica las dependencias y ejecuta los métodos según la concurrencia especificada. En este escenario también se admite la ejecución asíncrona.
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
En el ejemplo anterior, PyODPS DataFrame ejecuta primero el objeto de la dependencia compartida. Después, establece la concurrencia en 3 y ejecuta los objetos desde future1 hasta future3.
Puede especificar el parámetro async en delay.execute para indicar si se habilita la ejecución asíncrona. Si esta se encuentra habilitada, también puede usar el parámetro timeout para definir el periodo de tiempo de espera.