O PyODPS oferece uma API de DataFrame para processar dados estruturados no MaxCompute. Um objeto DataFrame pode referenciar quatro tipos de fontes de dados — tabelas do MaxCompute, partições do MaxCompute, DataFrames do Pandas e tabelas do SQLAlchemy — usando a mesma interface. Alterne entre as fontes de dados modificando a entrada, sem reescrever a lógica de processamento. Isso facilita o desenvolvimento e os testes locais com Pandas e a posterior execução da mesma lógica em escala no MaxCompute.
Pré-requisitos
Antes de começar, verifique se você tem:
A tabela de exemplo
pyodps_irisdisponível no seu projeto do MaxCompute. Para obter instruções de configuração, consulte Usar DataFrame para processar dados
Conceitos principais
O objeto DataFrame do PyODPS é o único objeto Collection que exige criação manual. Os três tipos principais de objetos são:
|
Objeto |
Estrutura |
Descrição |
|
|
Bidimensional |
Representa uma tabela completa |
|
|
Unidimensional |
Representa uma única coluna |
|
|
Valor único |
Representa um objeto escalar |
Avaliação preguiçosa: Um DataFrame criado a partir de uma tabela do MaxCompute não carrega os dados reais; ele mantém apenas uma representação das operações a executar. O MaxCompute executa essas operações e armazena os resultados somente quando você aciona a computação. Por outro lado, um DataFrame criado a partir de um DataFrame do Pandas mantém os dados reais na memória.
Referência rápida de fontes de dados
Todos os quatro métodos de criação usam o mesmo construtor DataFrame(source). A única diferença está no parâmetro passado como source.
|
Fonte de dados |
Método |
Uso típico |
|
Tabela do MaxCompute |
|
Processamento de dados em produção |
|
Partição do MaxCompute |
|
Processamento com escopo de partição |
|
DataFrame do Pandas |
|
Testes e desenvolvimento local |
|
Tabela do SQLAlchemy |
|
Acesso a tabelas de banco de dados |
Crie um objeto DataFrame a partir de uma tabela do MaxCompute
Passe o objeto de tabela diretamente para DataFrame ou chame to_df() na tabela.
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 os métodos produzem objetos DataFrame equivalentes, com o mesmo esquema.
Crie um objeto DataFrame a partir de uma partição do MaxCompute
Passe um objeto de partição para DataFrame ou chame to_df() na partição.
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()
Crie um objeto DataFrame a partir de um DataFrame do Pandas
Passe o DataFrame do Pandas para o construtor 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')))
Inferência de tipos de dados
Ao converter um DataFrame do Pandas, o PyODPS infere os tipos de dados automaticamente. Use os parâmetros abaixo para controlar a resolução de tipos quando a inferência falhar ou gerar resultados incorretos:
|
Parâmetro |
Tipo |
Descrição |
|
|
bool |
Quando definido como |
|
|
dict |
Defina explicitamente o tipo de dados de uma ou mais colunas; obrigatório para colunas do tipo |
Exemplo 1: Resolver uma coluna vazia e substituir um tipo de dados
df2 = DataFrame(df, unknown_as_string=True, as_type={'null_col2': 'float'})
print(df2.dtypes)
Saída:
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
}
Exemplo 2: Definir o tipo para uma coluna de lista
O PyODPS não infere tipos para colunas list ou dict. Defina as_type como um dicionário que mapeia os nomes das colunas aos respectivos tipos.
df4 = DataFrame(df3, as_type={'list_col': 'list<int64>'})
print(df4.dtypes)
Saída:
odps.Schema {
id int64
list_col list<int64> # as_type is required for list and dict columns
}
O PyODPS não oferece suporte ao upload de tabelas externas do Object Storage Service (OSS) ou do Tablestore para o MaxCompute.
Crie um objeto DataFrame a partir de uma tabela do SQLAlchemy
Conecte o SQLAlchemy ao seu projeto do MaxCompute e passe o objeto de tabela para DataFrame. Para obter os parâmetros de conexão, consulte Conectar o SQLAlchemy a um projeto do MaxCompute.
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)
Próximos passos
Após criar um objeto DataFrame, execute operações de dados usando a API de DataFrame do PyODPS. Para ver as operações disponíveis, consulte Usar DataFrame para processar dados.