开发者社区> 问答> 正文

MaxCompute 中python udf报错

MaxCompute中 python udf报错:ImportError: No module named 'xxx'

展开
收起
亢海鹏 2021-08-23 10:46:33 14801 0
1 条回答
写回答
取消 提交回答
  • MaxCompute 是面向分析的企业级 SaaS 模式云数据仓库,以 Serverless 架构提供快速、全托管的在线数据仓库服务,消除了传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您可以经济并高效的分析处理海量数据。

    找不到三方包时: 1、查看资源信息(desc resource resource-of-xxx.zip;) 检查三方包是否已上传为MaxCompute ARCHIVE类型资源,检查资源信息里的Type、LastModifiedTime、Md5sum是否符合预期。

    2、查看UDF函数信息,检查注册函数时三方包资源是否已填到资源列表里。

    3、检查UDF代码里是否将三方包的路径加到system path中。 假设模块名为 xxx 时,需要 确定文件夹 xxx 或文件 xxx.py 所在路径 在 UDF 里把这个路径加到 system path 中。 确定文件所在路径的方法: 如果将文件夹 resource_dir 直接压缩为 resource-of-xxx.zip。那么 UDF 运行时文件夹 resource_dir 所在路径为 work/resource-of-xxx.zip/resource_dir/ 如果选择文件夹 resource_dir 内所有文件压缩为 resource-of-xxx.zip(即不包含resource_dir)。那么 UDF 运行时 resource_dir 里的某个文件比如 xxx.py 所在路径为 work/resource-of-xxx.zip/ resource-of-xxx.zip 在本地解压后,假设xxx模块所在文件的相对路径为path1/path2/xxx.py、或xxx模块文件夹的相对路径为path1/path2/xxx。则需要在UDF代码添加如:sys.path.insert(0, 'work/resource-of-xxx.zip/path1/path2')。(ARCHIVE资源默认放在 UDF 执行路径的相对路径 ./work/ 中)

    4、三方包如果是whl包,请检查whl包的后缀是否正确,python2要求名字包含“cp27-cp27m-manylinux1_x86_64”,python3要求名字包含“cp37-cp37m-manylinux1_x86_64”。whl文件直接改后缀为zip,不要对whl文件再次打包生成zip文件。

    5、三方包如果不是whl包,但是是纯python包,请参考第3步检查压缩包的目录结构,需要将 xxx 文件夹或 xxx.py 的加到sys.path中。

    6、三方包如果不是whl包,也不是纯python包,检查里面是否有setup.py,如果有setup.py,需要在兼容环境编译后再重新上传使用,编译方法参考:https://help.aliyun.com/document_detail/189752.html?spm=a2c4g.11186623.6.737.7ba414c4hFsPgd#title-a1a-yub-jda

    7、检查UDF文件名和要引用的三方包模块名是否冲突。如果UDF文件是xxx.py,import xxx时默认会导入xxx.py而不是三方包里的模块,此时需要修改UDF文件名。

    2021-08-23 10:47:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载