镜像管理
MaxCompute提供镜像管理功能,内置数据分析、科学计算、机器学习(如Pandas、Numpy、Scikit-learn、Xgboost)等各类常用镜像,并已对镜像进行预先加热,您可在SQL UDF、PyODPS开发等场景中直接引用已有镜像,无需执行繁琐的镜像打包、上传等流程。
背景信息
MaxCompute提供用户自定义函数(UDF)及Python开发的能力,您可以通过编写Java或Python UDF函数实现不同的开发需求。开发UDF时,通常需要在UDF中依赖、引用众多第三方包。您需要准备环境、打包或下载所依赖的第三方包,并将其上传、提交至MaxCompute项目空间。
在开发过程中可能会遇到以下问题:
当UDF有较多外部依赖时,您需要找出UDF依赖的所有第三方包,打包并手动上传至MaxCompute项目空间,操作过程复杂、使用成本高。
不同的MaxCompute项目空间可能有相同的第三方包依赖,在不同项目空间中开发时需要分别上传依赖包,造成额外的管理成本及存储开销。
依赖包版本众多、开发环境不统一,不易维护,且容易造成不同环境带来的各类开发冲突问题。
因此,MaxCompute提供了预先加热的内置镜像,简化您的UDF及Python开发流程,方便您快速地完成开发,同时提高服务的响应速度和性能。
功能说明
丰富的内置镜像
内置如Pandas、NumPy、Scikit-learn、Xgboost等各类科学计算、数据分析类镜像,面向数据分析、数据挖掘等场景需求可直接使用,避免了繁琐的环境准备、打包及上传流程。
使用方式高效便捷
使用SQL调用UDF函数时,直接通过Flag参数方式指定所需镜像,即可在当前作业中生效;使用PyODPS(仅支持0.11.5及以上版本)开发时也可通过参数直接指定所需镜像。
使用限制
若您需要在PyODPS中引用镜像进行开发,请升级PyODPS至0.11.5或以上版本。
使用流程
查看内置镜像
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏选择租户管理 > 镜像管理,进入内置镜像模块,即可查看当前MaxCompute内置的镜像列表及相关版本信息。
内置镜像说明
功能分类 | 镜像名称 | 内置三方包及版本信息 | 编程语言及版本 | 说明 |
科学计算 | numpy | numpy 1.21.6 | Python 3.7 | 数值计算 |
scipy | scipy 1.7.3 | Python 3.7 | 科学计算 | |
数据分析 | pandas | pandas 1.3.5 | Python 3.7 | 数据处理与分析 |
统计建模 | statsmodels | statsmodels 0.13.5 | Python 3.7 | 统计建模 |
机器学习 | sklearn | scikit-learn 1.0.2 | Python 3.7 | 机器学习算法库 |
xgboost | xgboost 1.6.2 | Python 3.7 | 机器学习-分布式梯度增强 | |
pytorch | torch 1.13.1 | Python 3.7 | 深度神经网络 |
除此之外,上述内置镜像均自带基础开发包,包括cloudpickle 2.2.1、pickle5 0.0.12、requests 2.31.0及setuptools 68.0.0。
使用内置镜像
您可在SQL UDF或PyODPS开发中使用内置镜像。
调用UDF时,支持在SQL会话(Session)级别使用Flag指定所依赖的镜像,需同时指定Python版本,命令如下:
set odps.sql.python.version=cp37; set odps.session.image = <镜像名称>;
支持在PyODPS开发中,使用execute或persist方法的image参数指定已有镜像,具体示例请参见在PyODPS开发中使用镜像。命令如下:
image='<镜像名称>'
重要每个开发作业仅可指定一个镜像,否则会造成镜像冲突问题。
场景实践
在SQL UDF开发中使用镜像
以下以使用Pandas实现一个列求和的UDF为例,为您介绍如何在SQL UDF开发中使用镜像。
编写Python UDF脚本,并将其保存为
sum_pandas.py
文件。脚本示例如下:from odps.udf import annotate import pandas as pd @annotate("string, string -> string") class SumColumns(object): def evaluate(self, arg1, arg2): # 将输入参数转换为pandas DataFrame df = pd.DataFrame({'col1': arg1.split(','), 'col2': arg2.split(',')}) # 使用pandas进行数据处理操作 # 这里以计算两列的和为例 df['sum'] = df['col1'].astype(int) + df['col2'].astype(int) # 将处理结果转换为字符串并返回 result = ','.join(df['sum'].astype(str).values) return result
将
sum_pandas.py
脚本以资源形式上传至MaxCompute项目空间,详情请参见添加资源。命令示例如下:ADD PY sum_pandas.py -f;
将已上传的
sum_pandas.py
脚本注册为自定义函数SumColumns,具体操作请参见注册函数。命令示例如下:CREATE FUNCTION SumColumns AS 'sum_pandas.SumColumns' USING 'sum_pandas.py';
准备测试表
testsum
及测试数据。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');
调用UDF函数时通过Flag指定镜像。
set odps.sql.python.version=cp37; set odps.session.image = pandas; SELECT SumColumns(col1,col2) AS result FROM testsum;
返回结果:
+------------+ | result | +------------+ | 2,4,6 | | 4,4,4 | | 5,7,9 | +------------+
在PyODPS开发中使用镜像
以下以实现scipy包中的psi函数为例,为您介绍如何在PyODPS中使用镜像。
准备测试表
test_float_col
及测试数据。CREATE TABLE test_float_col (col1 double); INSERT INTO test_float_col VALUES (3.75),(2.51);
编写PyODPS代码,计算psi(col1)的值,并保存为psi_col.py文件执行。代码示例如下:
import os from odps import ODPS, options def my_psi(v): from scipy.special import psi return float(psi(v)) # 如果 Project 开启了 Isolation,下面的选项不是必需的 options.sql.settings = {"odps.isolation.session.enable": True} o = ODPS('ALIBABA_CLOUD_ACCESS_KEY_ID', 'ALIBABA_CLOUD_ACCESS_KEY_SECRET', '<YOUR_DEFAULT_PROJECT>', '<YOUR_ENDPOINT>') df = o.get_table("test_float_col").to_df() # 直接执行并取得结果 df.col1.map(my_psi).execute(image='scipy') # 保存到另一张表 df.col1.map(my_psi).persist("result_table", image='scipy')
查看结果表result_table。
SELECT * FROM result_table
返回结果:
+------------+ | col1 | +------------+ | 1.1825373886117962 | | 0.7080484451910534 | +------------+