当标准的PyODPS功能无法满足复杂的业务需求时,开发者需要复用已有的Python代码逻辑,或利用开源库来完成任务。为此,DataWorks 提供两种核心方案:通过资源引用灵活加载自定义脚本,或通过配置执行环境(如自定义镜像、运维助手)来集成功能强大的第三方包。本文介绍如何在DataWorks的PyODPS节点中调用自定义Python脚本或安装并使用开源第三方包,以扩展数据处理能力。
场景快速选择
根据您的环境和需求,选择对应的操作路径:
| 场景 | 资源组类型 | 方案 | 
| 依赖开源三方包 | Serverless资源组 | |
| 独享调度资源组 | ||
| 仅依赖自定义的 | Serverless资源组/独享调度资源组 | 
不同方案的主要流程如下图所示:
准备工作
在开始之前,请确保您理解以下两个关键概念,以决定您的配置方式。
概念说明
- 节点类型:PyODPS 2 VS PyODPS 3 - PyODPS 2:基于 Python 2.7 环境。 
- PyODPS 3:基于 Python 3.7+ 环境。 
- 建议:强烈推荐使用 PyODPS 3,因为Python 2已停止官方维护。本文主线教程将以PyODPS 3为例。 
 
- 资源组类型:Serverless资源组 VS 独享调度资源组 
资源组类型判断
您可以在DataWorks控制台工作空间详情的资源组页面,查看您工作空间绑定的资源组类型。
- 如果为通用型,则表示使用的Serverless资源组。 
- 如果为数据调度,则表示使用的独享调度资源组。 
通过自定义镜像安装开源包
此方法适用于Serverless资源组。
本节将引导您完成一个完整的端到端案例:创建一个包含pendulum包的自定义环境,并在PyODPS 3节点中调用它来获取并格式化特定时区的当前时间。
步骤一:创建包含 pendulum 的自定义镜像
自定义镜像是为Serverless资源组准备运行环境的方式。
- 登录DataWorks控制台,单击左侧导航栏上的镜像管理进入镜像管理页面。 
- 切换至自定义镜像页签,进入自定义镜像列表页。 
- 单击左上角的创建镜像按钮,在创建页面,配置以下关键参数: - 参数 - 说明 - 镜像名称 - 自定义镜像的名称,例如 - pyodps3_with_pendulum。- 引用类型 - 选择DataWorks官方镜像。 - 镜像名称/ID - 下拉选择DataWorks提供的官方镜像dataworks_pyodps_task_pod。 - 支持任务类型 - 选择PyODPS 3任务类型。 - 安装包 - 选择Python3,下拉选择系统提供的pendulum包。 - 若需安装非内置开源包,可通过Script模式手动安装。更多配置方式,可参见创建自定义镜像参数。 重要- 若从公网安装开源包时,Serverless资源组绑定的VPC需具备公网访问能力。 
- 单击确认,完成自定义镜像创建。 
- 在自定义镜像列表页,对目标镜像进行测试并发布。仅当测试通过之后,方可发布。 
- 在目标镜像操作列单击,为自定义镜像绑定归属工作空间。  
步骤二:创建并配置PyODPS 3节点
- 单击左侧导航栏的,在下拉框中选择目标工作空间后单击进入数据开发。 
- 在已有的业务流程下创建一个新的PyODPS 3节点,例如命名为 - pyodps3_pendulum_test。
- 在 - pyodps_pendulum_test节点的代码编辑器中,编写Python 3代码:- # 因为pendulum已在自定义镜像中安装,所以可以直接导入。Python3语法 import pendulum print("开始测试第三方包 pendulum...") try: # 使用pendulum获取“亚洲/上海”时区的当前时间 shanghai_time = pendulum.now('Asia/Shanghai') # 打印格式化后的时间和时区信息 print(f"成功导入 'pendulum' 包。") print(f"当前上海时间是: {shanghai_time.to_datetime_string()}") print(f"对应的时区是: {shanghai_time.timezone_name}") print("\n测试通过!PyODPS节点成功调用了第三方包。") except Exception as e: print(f"测试失败,发生错误: {e}")
步骤三:测试运行验证结果
- 单击工具栏  图标运行代码,在参数弹窗中选择您所创建的镜像 图标运行代码,在参数弹窗中选择您所创建的镜像- pyodps3_with_pendulum。重要- 若找不到目标镜像,请将镜像绑定至当前工作空间。具体操作请参见步骤一的第6小步。 
- 查看下方的运行日志,您将看到类似以下的输出,证明 - pendulum包已成功被调用。 
步骤四:发布PyODPS 3节点
完成测试后,需在节点编辑页面右侧的,选择准备的Serverless资源组并修改镜像为创建的镜像pyodps3_with_pendulum。后续按正常流程发布节点至运维中心即可。
使用运维助手安装开源包
此方法适用于旧版独享调度资源组,该类型资源组已不再推荐。建议您迁移至功能更强大、更灵活的Serverless资源组。
- 登录DataWorks工作空间列表,在顶部切换地域,然后找到目标工作空间,单击操作列的详情,进入工作空间详情页。 
- 在左侧导航栏单击资源组,找到已绑定的独享调度资源组,单击操作列的。 
- 在运维助手页面,单击左上角的创建命令。 
- 根据您的Python版本输入相应命令: - Python 3 (PyODPS 3):保持其他默认选项,下拉选择Python3包类型下pendulum安装包。 
- Python 2 (PyODPS 2):选择手动输入模式,输入命令内容。 - pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple pip install "pendulum<2.0" -i https://pypi.tuna.tsinghua.edu.cn/simple
 
- 在运维助手页面,单击操作栏的运行命令。执行成功后,您便可以在对应的PyODPS节点中直接 - import pendulum使用。
引用自定义 Python 资源
如果您只是想调用自己写的另一个 .py 文件中的函数,操作如下:
- 创建Python资源: - 在数据开发页面,右键单击目标业务流程,选择。 
- 在新建资源对话框中,填写资源名称(示例名: - my_utils.py),单击新建。
- 在Python资源中输入如下代码。 - # my_utils.py Python3语法 def say_hello(name): print(f"Hello, {name}! This is from my_utils module.")
- 保存并提交该资源。 
 
- 创建PyODPS 3节点并引用资源: - 在目标业务流程,右键单击MaxCompute,选择,按界面完成节点创建。 
- 在节点中通过 - ##@resource_reference{"my_utils.py"}引用上述资源,代码如下:- ##@resource_reference{"my_utils.py"} import sys import os #将资源所在的当前目录添加到Python解释器的搜索路径中 sys.path.append(os.path.dirname(os.path.abspath('my_utils.py'))) #现在可以像普通模块一样导入和使用了 import my_utils my_utils.say_hello("DataWorks")
 
- 运行节点,您将在日志中看到 "Hello, DataWorks! This is from my_utils module." 的输出。 
常见问题
- Q:通过命令手动安装包时,自定义镜像测试很久没进度。 - 如果任务运行的环境需要依赖位于公网的第三方包,则Serverless资源组绑定的VPC需要具备公网访问能力。具体操作请参见为资源组开通公网。 
- 可切换尝试不同Python包来源,例如https://mirrors.aliyun.com/pypi/simple/。阿里云镜像不需要公网访问。 
 
- Q:如果导入第三方包失败,请按以下步骤排查。 - 确认自定义镜像是否已发布成功。 
- 确认镜像支持的任务类型(PyODPS 2/3)与您创建的节点类型匹配。 
- 确认PyODPS节点的调度配置中,是否正确选择该自定义镜像。 - 资源组不可选择公共资源组。 
- 检查安装的包版本是否与您的Python版本兼容(例如 - pendulum2.0+ 不支持Python 2)。
 
 > 修改归属工作空间
 > 修改归属工作空间 > 运维助手
 > 运维助手