O MaxFrame oferece duas formas de incluir dependências externas em seus jobs Python: enviar um pacote de terceiros como recurso Archive ou especificar uma imagem integrada que já contenha as bibliotecas necessárias.
Consulte a tabela abaixo para escolher a abordagem mais adequada:
|
Abordagem |
Quando usar |
|
Pacote de terceiros |
Ideal quando você precisa de uma versão específica de biblioteca ou de um pacote personalizado indisponível no ambiente padrão. Envie o pacote uma única vez e referencie-o por função com |
|
Imagem |
Recomendado para jobs que dependem de várias bibliotecas pré-instaladas (como a imagem integrada |
Pré-requisitos
Antes de começar, verifique se você possui:
Um projeto MaxCompute com as permissões necessárias para criar recursos
O cliente local do MaxFrame instalado e configurado
Seu AccessKey ID e AccessKey secret armazenados como variáveis de ambiente:
ALIBABA_CLOUD_ACCESS_KEY_IDeALIBABA_CLOUD_ACCESS_KEY_SECRET
Uso de um pacote de terceiros
Etapa 1: Enviar o pacote
Envie seu pacote para o MaxCompute como um recurso Archive antes de referenciá-lo no código. Há dois métodos disponíveis.
Método 1: Envio via ODPS SDK
import os
from odps import ODPS
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<your-project>',
endpoint='<your-endpoint>',
)
# Replace packages.tar.gz with the path and filename of your package.
o.create_resource("packages.tar.gz", "archive", fileobj=open("packages.tar.gz", "rb"))
|
Espaço reservado |
Descrição |
|
|
Nome do seu projeto MaxCompute |
|
|
URL do endpoint do MaxCompute |
Para obter mais informações sobre como empacotar uma biblioteca de terceiros para envio, consulte Criar um pacote de terceiros para PyODPS .
Método 2: Envio via DataWorks
Consulte Criar e usar recursos do MaxCompute.
Etapa 2: Referenciar o pacote no código
Importe with_resource_libraries de maxframe.udf e aplique-o como decorador nas funções que utilizam o pacote.
from maxframe.udf import with_resource_libraries
@with_resource_libraries("packages.tar.gz", "demo.py")
def my_function(v):
# Import the library from the referenced package.
import some_library
return some_library.process(v)
Passe o nome do arquivo de recurso (conforme enviado ao MaxCompute) como argumento. O decorador aceita vários nomes de recursos, incluindo arquivos .py. Para mais detalhes sobre o empacotamento automático, consulte Serviço de empacotamento automático.
Exemplo: Calcular PSI com um pacote de terceiros
Este exemplo utiliza packages.tar.gz para calcular o Population Stability Index (PSI) de uma coluna em uma tabela de teste.
Baixe o pacote de amostra em packages.tar.gz.
1. Crie a tabela de teste e insira dados de amostra.
CREATE TABLE test_float_col (col1 double);
INSERT INTO test_float_col VALUES (3.75),(2.51);
2. Escreva o job do MaxFrame e salve-o como demo.py.
import os
from odps import ODPS, options
from maxframe.session import new_session
import maxframe.dataframe as md
from maxframe.config import options
from maxframe import config
from maxframe.udf import with_resource_libraries
# Reference the third-party package.
@with_resource_libraries("packages.tar.gz")
def my_psi(v):
from scipy.special import psi
return float(psi(v))
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<your-project>',
endpoint='<your-endpoint>',
)
# Create a MaxFrame session.
session = new_session(o)
df = md.read_odps_table('test_float_col')
# Run the UDF and print results.
print(df.col1.map(my_psi).execute().fetch())
3. Execute o script usando o cliente local do MaxFrame.
python demo.py
Saída esperada:
0 1.182537
1 0.708048
Name: col1, dtype: float64
Uso de uma imagem
Defina odps.session.image em config.options.sql.settings para especificar uma imagem integrada para o job. Todas as funções na sessão executarão no ambiente dessa imagem.
Exemplo: Calcular PSI com a imagem scipy
Este exemplo usa a imagem integrada scipy para calcular o PSI de uma coluna em uma tabela de teste.
1. Crie a tabela de teste e insira dados de amostra.
CREATE TABLE test_float_col (col1 double);
INSERT INTO test_float_col VALUES (3.75),(2.51);
2. Escreva o job do MaxFrame e salve-o como demo.py.
import os
from odps import ODPS, options
from maxframe.session import new_session
import maxframe.dataframe as md
from maxframe.config import options
from maxframe import config
# Specify the built-in scipy image for this session.
config.options.sql.settings = {
"odps.session.image": "scipy"
}
def my_psi(v):
from scipy.special import psi
return float(psi(v))
o = ODPS(
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
project='<your-project>',
endpoint='<your-endpoint>',
)
# Create a MaxFrame session.
session = new_session(o)
df = md.read_odps_table('test_float_col')
# Run the function and print results.
print(df.col1.map(my_psi).execute().fetch())
3. Execute o script usando o cliente local do MaxFrame.
python demo.py
Saída esperada:
0 1.182537
1 0.708048
Name: col1, dtype: float64
Próximos passos
Serviço de empacotamento automático — saiba como o MaxFrame empacota dependências automaticamente
Criar um pacote de terceiros para PyODPS — prepare um pacote para envio
Criar e usar recursos do MaxCompute — gerencie recursos pelo DataWorks