PyODPS ofrece una API de DataFrame para procesar datos estructurados en MaxCompute. Un objeto DataFrame permite referenciar cuatro tipos de orígenes de datos (tablas de MaxCompute, particiones de MaxCompute, DataFrames de Pandas y tablas de SQLAlchemy) mediante la misma interfaz. Cambie entre orígenes de datos al modificar la entrada, sin necesidad de reescribir su lógica de procesamiento. Esto facilita el desarrollo y las pruebas locales del código con Pandas para luego ejecutar la misma lógica a gran escala en MaxCompute.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
La tabla de ejemplo
pyodps_irisdisponible en su proyecto de MaxCompute. Para obtener instrucciones de configuración, consulte Use DataFrame to process data.
Conceptos clave
El objeto DataFrame de PyODPS es el único objeto Collection que debe crear manualmente. Los tres tipos de objetos principales son:
|
Object |
Structure |
Description |
|
|
Bidimensional |
Representa una tabla completa |
|
|
Unidimensional |
Representa una sola columna |
|
|
Valor único |
Representa un objeto escalar |
Evaluación diferida: Un DataFrame construido a partir de una tabla de MaxCompute no carga los datos reales, sino que conserva una representación de las operaciones por ejecutar. MaxCompute ejecuta dichas operaciones y almacena los resultados únicamente cuando se desencadena el cálculo. Por el contrario, un DataFrame creado a partir de un DataFrame de Pandas mantiene los datos reales en memoria.
Referencia rápida de orígenes de datos
Los cuatro métodos de creación utilizan el mismo constructor DataFrame(source). La única diferencia radica en el valor que se pasa como source.
|
Data source |
Method |
Typical use |
|
Tabla de MaxCompute |
|
Procesamiento de datos en producción |
|
Partición de MaxCompute |
|
Procesamiento acotado a una partición |
|
DataFrame de Pandas |
|
Pruebas y desarrollo local |
|
Tabla de SQLAlchemy |
|
Acceso a tablas de base de datos |
Creación de un objeto DataFrame a partir de una tabla de MaxCompute
Pase el objeto de tabla directamente a DataFrame o invoque to_df() sobre la tabla.
from odps.df import DataFrame
# Method 1: Pass the table object to DataFrame
iris = DataFrame(o.get_table('pyodps_iris'))
# Method 2: Use the to_df method on the table
iris2 = o.get_table('pyodps_iris').to_df()
Ambos métodos generan objetos DataFrame equivalentes con el mismo esquema.
Creación de un objeto DataFrame a partir de una partición de MaxCompute
Pase un objeto de partición a DataFrame o invoque to_df() sobre la partición.
from odps.df import DataFrame
# Create a partitioned table if one does not already exist
o.create_table('partitioned_table', ('num bigint, num2 double', 'pt string'), if_not_exists=True)
# Method 1: Pass the partition object to DataFrame
pt_df = DataFrame(o.get_table('partitioned_table').get_partition('pt=20171111'))
# Method 2: Use the to_df method on the partition
pt_df2 = o.get_table('partitioned_table').get_partition('pt=20171111').to_df()
Creación de un objeto DataFrame a partir de un DataFrame de Pandas
Pase el DataFrame de Pandas al constructor DataFrame.
from odps.df import DataFrame
import pandas as pd
import numpy as np
df = DataFrame(pd.DataFrame(np.arange(9).reshape(3, 3), columns=list('abc')))
Inferencia de tipos de datos
Al convertir un DataFrame de Pandas, PyODPS infiere los tipos de datos automáticamente. Utilice los siguientes parámetros para controlar la resolución de tipos cuando la inferencia falla o produce resultados incorrectos:
|
Parameter |
Type |
Description |
|
|
bool |
Si es |
|
|
dict |
Establezca explícitamente el tipo de dato para una o más columnas; es obligatorio para las columnas de tipo |
Ejemplo 1: Resolución de una columna vacía y anulación de un tipo de dato
df2 = DataFrame(df, unknown_as_string=True, as_type={'null_col2': 'float'})
print(df2.dtypes)
Salida:
odps.Schema {
sepallength float64
sepalwidth float64
petallength float64
petalwidth float64
name string
null_col1 string # unknown_as_string=True converted this to string
null_col2 float64 # as_type forced this to float
}
Ejemplo 2: Definición del tipo para una columna de lista
PyODPS no infiere tipos para columnas de tipo list o dict. Configure as_type con un diccionario que asigne los nombres de las columnas a sus tipos correspondientes.
df4 = DataFrame(df3, as_type={'list_col': 'list<int64>'})
print(df4.dtypes)
Salida:
odps.Schema {
id int64
list_col list<int64> # as_type is required for list and dict columns
}
PyODPS no admite la carga de tablas externas de Object Storage Service (OSS) o Tablestore a MaxCompute.
Creación de un objeto DataFrame a partir de una tabla de SQLAlchemy
Conecte SQLAlchemy a su proyecto de MaxCompute y pase el objeto de tabla a DataFrame. Para consultar los parámetros de conexión, revise Connect SQLAlchemy to a MaxCompute project.
import os
from odps.df import DataFrame
import sqlalchemy
# Build the connection string using environment variables for your AccessKey credentials.
# Set ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET before running this code.
conn_string = 'odps://%s:%s@<project>/?endpoint=<endpoint>' % (
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
engine = sqlalchemy.create_engine(conn_string)
metadata = sqlalchemy.MetaData(bind=engine) # Bind metadata to the engine
table = sqlalchemy.Table('pyodps_iris', metadata, extend_existing=True, autoload=True)
iris = DataFrame(table)
Pasos siguientes
Una vez creado el objeto DataFrame, ejecute operaciones de datos mediante la API de DataFrame de PyODPS. Para consultar las operaciones disponibles, revise Use DataFrame to process data.