O MaxCompute oferece suporte a funções definidas pelo usuário (UDFs), PyODPS e MaxFrame para desenvolvimento de jobs. Utilize imagens para incluir pacotes Python de terceiros, como pandas e SciPy, em seus jobs de UDF, PyODPS e MaxFrame.
Uso de imagens em SQL UDFs
O exemplo a seguir cria uma UDF baseada em pandas que soma os valores de duas colunas.
-
Escreva um script de UDF Python e salve-o como o arquivo
sum_pandas.py. Exemplo de código:from odps.udf import annotate import pandas as pd @annotate("string, string -> string") class SumColumns(object): def evaluate(self, arg1, arg2): # Convert the input arguments to a pandas DataFrame. df = pd.DataFrame({'col1': arg1.split(','), 'col2': arg2.split(',')}) # Process the data by using pandas. # This example calculates the sum of two columns. df['sum'] = df['col1'].astype(int) + df['col2'].astype(int) # Convert the result to a string and return it. result = ','.join(df['sum'].astype(str).values) return result -
Carregue o script
sum_pandas.pycomo recurso no seu projeto MaxCompute. Para mais informações, consulte Adicionar resources. O comando de exemplo a seguir demonstra como carregar o script:ADD PY sum_pandas.py -f; -
Registre o script
sum_pandas.pycarregado como a função definida pelo usuário SumColumns. Para mais detalhes, consulte Registrar uma função. O comando abaixo ilustra o registro da função:CREATE FUNCTION SumColumns AS 'sum_pandas.SumColumns' USING 'sum_pandas.py'; -
Crie uma tabela de teste chamada
testsume insira dados de teste.CREATE TABLE testsum (col1 string, col2 string); INSERT INTO testsum VALUES ('1,2,3','1,2,3'),('1,2,3','3,2,1'),('1,2,3','4,5,6'); -
Chame a UDF e especifique uma imagem existente usando uma flag.
set odps.sql.python.version=cp37; set odps.session.image = <image_name>; SELECT SumColumns(col1,col2) AS result FROM testsum;Resultado retornado:
+------------+ | result | +------------+ | 2,4,6 | | 4,4,4 | | 5,7,9 | +------------+
Uso de imagens no PyODPS
Este exemplo usa uma imagem para chamar a função psi do pacote SciPy em um job PyODPS.
-
Crie uma tabela de teste chamada
test_float_cole insira dados de teste.CREATE TABLE test_float_col (col1 double); INSERT INTO test_float_col VALUES (3.75),(2.51); -
Escreva um script PyODPS para calcular o valor de
psi(col1), salve-o comopsi_col.pye execute o arquivo. Exemplo de código:import os from odps import ODPS, options def my_psi(v): from scipy.special import psi return float(psi(v)) # If the project has isolation enabled, the following option is not required. options.sql.settings = {"odps.isolation.session.enable": True} o = ODPS( # Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set to your AccessKey ID, # and the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set to your AccessKey secret. # We recommend that you do not hardcode your AccessKey ID and AccessKey secret in the code. os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point' ) df = o.get_table("test_float_col").to_df() # Execute the job and retrieve the result. df.col1.map(my_psi).execute(image='scipy') # Save the result to another table. df.col1.map(my_psi).persist("result_table", image='scipy')Descrição dos parâmetros:
ALIBABA_CLOUD_ACCESS_KEY_ID: Defina esta variável de ambiente com um AccessKey ID que tenha as permissões do MaxCompute necessárias nos objetos do projeto MaxCompute de destino. Para obter um AccessKey ID, acesse a página AccessKey Management.
ALIBABA_CLOUD_ACCESS_KEY_SECRET: Defina esta variável de ambiente com o AccessKey secret correspondente ao AccessKey ID.
your-default-project: Nome do seu projeto MaxCompute. Para visualizar o nome do projeto, faça login no console do MaxCompute e escolha Workspace > Projects no painel de navegação à esquerda.
your-end-point: Endpoint da região onde reside o seu projeto MaxCompute. Selecione um endpoint conforme o tipo de conexão de rede, por exemplo,
http://service.cn-chengdu.maxcompute.aliyun.com/api. Para mais informações, consulte Endpoints.
-
Visualize os resultados na tabela
result_table.SELECT * FROM result_tableResultado retornado:
+------------+ | col1 | +------------+ | 1.1825373886117962 | | 0.7080484451910534 | +------------+
Uso de imagens no MaxFrame
O exemplo a seguir usa uma imagem para chamar a função psi do pacote SciPy em um job MaxFrame.
-
Crie uma tabela de teste chamada
test_float_cole insira dados de teste.CREATE TABLE test_float_col (col1 double); INSERT INTO test_float_col VALUES (3.75),(2.51); -
Escreva um script MaxFrame para calcular o valor de
psi(col1), salve-o comopsi_col.pye execute o arquivo. Exemplo de código: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 # Reference the built-in SciPy image. config.options.sql.settings = { "odps.session.image": "scipy" } def my_psi(v): from scipy.special import psi return float(psi(v)) o = ODPS( # Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID environment variable is set to your AccessKey ID, # and the ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variable is set to your AccessKey secret. # We recommend that you do not hardcode your AccessKey ID and AccessKey secret in the code. os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'), os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'), project='your-default-project', endpoint='your-end-point' ) # Create a MaxFrame session. session = new_session(o) df = md.read_odps_table('test_float_col') # Execute the job and retrieve the result. print(df.col1.map(my_psi).execute().fetch())Descrição dos parâmetros:
ALIBABA_CLOUD_ACCESS_KEY_ID: Defina esta variável de ambiente com um AccessKey ID que tenha as permissões do MaxCompute necessárias nos objetos do projeto MaxCompute de destino. Para obter um AccessKey ID, acesse a página AccessKey Management.
ALIBABA_CLOUD_ACCESS_KEY_SECRET: Defina esta variável de ambiente com o AccessKey secret correspondente ao AccessKey ID.
your-default-project: Nome do seu projeto MaxCompute. Para visualizar o nome do projeto, faça login no console do MaxCompute e escolha Workspace > Projects no painel de navegação à esquerda.
your-end-point: Endpoint da região onde reside o seu projeto MaxCompute. Selecione um endpoint conforme o tipo de conexão de rede, por exemplo,
http://service.cn-chengdu.maxcompute.aliyun.com/api. Para mais informações, consulte Endpoints.
Resultado retornado:
0 1.182537 1 0.708048 Name: col1, dtype: float64