详情页标题前

阿里云云原生大数据计算服务 MaxComputePyODPS DataFrame的代码运行环境-云淘科技

详情页1

使用PyODPS DataFrame编写数据应用时,同一个脚本文件中的代码会在不同位置执行,可能导致一些无法预期的问题,本文为您介绍当出现相关问题时,如何确定代码的执行环境,以及提供部分场景下的解决方案。

概述

PyODPS是一个Python而非Python Implementation,其运行环境均为未经修改的Python,因而并不会出现与正常Python解释器不一致的行为。即您所编写的每一条语句都与标准Python语句行为相同,例如自动变成分布式代码等。

  • 代码示例

    from odps import ODPS, options
    import numpy as np
    
    o = ODPS(...)
    df = o.get_table('pyodps_iris').to_df()
    
    coeffs = [0.1, 0.2, 0.4]
    
    def handle(v):
        import numpy as np
        return float(np.cosh(v)) * sum(coeffs)
    
    options.df.supersede_libraries = True
    val = df.sepal_length.map(handle).sum().execute(libraries=['numpy.zip', 'other.zip'])
    print(np.sinh(val))
  • 代码执行系统

    下图是上述代码执行时可能涉及的系统。代码本身执行的系统都位于MaxCompute外部,为了方便表述,下文统称为本地阿里云云原生大数据计算服务 MaxComputePyODPS DataFrame的代码运行环境-云淘科技

  • 代码分析

    • 引用第三方包

      在本地执行的代码包括handle函数之外的部分(注意handle传入map时仅传入了函数本身而并未执行)。因而,这些代码在执行时,行为与普通Python code的执行行为类似,导入第三方包时,引用的是本地的包。上述代码中,libraries=['numpy.zip', 'other.zip']中引用的other.zip因为并没有在本地安装,如果代码中有诸如import other的语句,则会导致执行报错。即便other.zip已被上传至MaxCompute资源也是如此,因为本地不存在other.zip包。理论上,本地代码如果不涉及PyODPS包,则与PyODPS无关,执行报错时您需要自行排查。

    • handle函数

      handle函数传入map方法时,如果使用的后端是MaxCompute后端,会经历以下几个阶段:

      1. 会先被cloudpickle模块提取闭包和字节码。

      2. PyODPS DataFrame使用闭包和字节码生成一个Python UDF,提交至MaxCompute。

      3. 作业以SQL的形式在MaxCompute执行时,会调用已生成的Python UDF,其中的字节码和闭包内容会被unpickle(反序列化),然后在MaxCompute Executor执行。

    • 总结

      • handle函数体中的代码都不会在本地执行,而是在MaxCompute Executor中执行。

      • handle函数体中无法引用本地安装的包,只有在MaxCompute Executor中存在的包才有效。

      • 上传的第三方包必须能够在MaxCompute Executor的Python版本(目前为Python 2.7,UCS2)中调用。

      • handle函数体中修改引用的外部变量(例如上述代码中的coeffs)不会导致本地的coeffs值被修改。

      • 如果在handle函数体中引用在handle外import的包可能会报错,因为在不同环境中,包的结构可能不同,而cloudpickle会将本地包的引用代入MaxCompute Executor,导致报错,因而建议import在handle函数体中进行。

      • 由于使用cloudpickle,如果在handle函数体中调用了其他文件的代码,该文件所在的包必须存在于MaxCompute Executor中。如果您不想使用第三方包的形式解决该问题,请将所有引用的个人代码放在同一个文件中。

上述handle函数的解释对于自定义聚合、apply和map_reduce中调用的自定义方法/Agg类均适用。如果使用的后端是Pandas后端,则所有代码都会在本地运行,因而本地也需要安装相关的包。但鉴于Pandas后端调试完毕后通常会转移到MaxCompute运行,建议在本地安装包的同时,参照MaxCompute后端的惯例进行开发。

使用第三方包

  • 个人电脑/自有服务器:在本地使用第三方包或其他文件中的代码时,在相应的Python版本上安装即可。

  • Notebook:在本地代码中使用第三方包或其他文件中的代码请咨询平台提供方。

  • DataWorks:DataWorks不支持在本地安装第三方包,但可以进行调用。对于其他文件中的代码,可以通过读取文件+exec命令的方式在本地进行使用。详情请参见在PyODPS节点中调用第三方包。

    重要

    • DataStudio中的目录结构并非文件系统中真实存在的目录结构,直接import或打开DataStudio中显示的文件路径会导致执行失败。

    • 在DataWorks中上传资源后,需要点击提交确保资源被正确上传到ODPS。

    • 如果需要使用自己的Numpy版本,在上传正确的wheel包的同时,需要配置odps.df.supersede_libraries = True,同时确保您上传的Numpy包名作为libraries的第一个参数。

引用其他MaxCompute表中的数据

  • 个人电脑/自有服务器:在本地访问MaxCompute表,如果Endpoint可以连接,使用PyODPS/DataFrame访问。

  • Notebook/DataWorks:在本地代码中访问MaxCompute表,如果Endpoint可以连接,使用PyODPS/DataFrame访问。连接Endpoint时出现问题请咨询平台提供方。

  • map/apply/map_reduce/自定义聚合:访问其他MaxCompute表,MaxCompute Executor中通常不支持访问Endpoint/Tunnel Endpoint,也没有PyODPS包可用,因而不能直接使用ODPS入口对象或者PyODPS DataFrame,也不能从自定义函数外部传入这些对象。如果表的数据量不大,建议将DataFrame作为资源传入,详情请参见引用资源。如果数据量较大,建议改写为表JOIN。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/159691.html

(0)
上一篇 2023年12月10日 上午1:50
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云日志服务SLS使用限制-云淘科技

    本文介绍定时SQL的使用限制。 特殊任务 日志服务的Trace、Cloud Lens for SLB等功能依赖定时SQL。为了保证这些功能的正常运行,定时SQL限制了这类任务的变更操作,即不支持在定时SQL的任务管理界面对这类任务进行更新、复制和删除操作。如果您需要更新、复制和删除任务,请在相关功能的界面中执行。 查询与分析 重要 定时SQL仅支持SQL独享…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云大数据开发治理平台 DataWorksPolarDB数据源-云淘科技

    PolarDB数据源为您提供读取和写入PolarDB双向通道的功能,您可以通过向导模式和脚本模式配置同步任务。 使用限制 离线读写 支持读取视图表。 实时读 来源数据源为阿里云PolarDB MySQL时,您需要开启Binlog。阿里云PolarDB MySQL是一款完全兼容MySQL的云原生数据库,默认使用了更高级别的物理日志代替Binlog,但为了更好地…

  • 阿里云RDS数据库批量更新、删除或插入数据-云淘科技

    批量操作可以减少数据库与应用程序的交互次数,提高数据处理的吞吐量。本文将通过示例介绍如何批量插入、更新和删除数据。 批量插入数据 您可以通过如下四种方法进行批量插入数据。 以下示例中使用的测试表tbl1的建表语句如下: CREATE TABLE tbl1 ( id SERIAL PRIMARY KEY, info TEXT, crt_time TIMESTA…

    阿里云数据库 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 函数计算里python打包第三方库怎么办?-云小二-阿里云

    函数计算里python打包第三方库怎么办? 以下为热心网友提供的参考意见 使用控制台 WebIDE使用 WebIDE 对 python 进行第三方依赖安装使用现成的官方公共层比如 Pandas1x 、PyTorch1x、 SciPy1x、 Flask2x 等详情查看 awesome-layers 兼容运行时为 python runtime 的层使用 s工具可…

    阿里云 2023年12月26日
  • 阿里云RDS数据库MigrateConnectionToOtherZone – 迁移RDS实例至其他可用区-云淘科技

    该接口用于迁移RDS实例的可用区。 接口说明 适用引擎 RDS MySQL RDS PostgreSQL RDS SQL Server 相关功能文档 注意 使用该接口前,请仔细阅读功能文档,确保完全了解使用接口的前提条件及使用后造成的影响后,再进行操作。 RDS MySQL迁移可用区 RDS PostgreSQL迁移可用区 RDS SQL Server迁移可…

    阿里云数据库 2023年12月9日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。