5.2.5多引擎开发参考
5.2.5.1PyODPS
为了帮助记忆,可以使用PyODPS = SDK + DataFrame API 公式来理解PyODPS的主要功能。
•SDK
它是MaxCompute的Python版本的SDK,提供对MaxCompute对象的基本操作,通过Python语言实现简单方便地操作MaxCompute对象(项目、表、分区、实例等)。
•DataFrame
PyODPS支持类似Pandas DataFrame的快速、灵活和富有表现力的数据结构——MaxCompute DataFrame。DataFrame框架本身是对于二维表结构十分优秀的抽象,提供的API能很便捷地对于表数据或查询结果进行处理,是PyODPS最核心的feature。
5.2.5.1.1 PyODPS DataFrame
为什么需要单独来谈PyODPS DataFrame(以下简写为DF,此处特指PyODPS DataFrame,请注意和Pandas DataFrame区分)?因为在同一段PyODPS代码中,需要特别留意区分普通代码脚本和DF相关脚本。在开发者看来明明是同一套代码,但是其中的DF部分却是在不同的环境里执行的,下面借助这张图进一步阐释。
总体上看,可以简单地这么记忆:DF代码会在上图框选的MaxCompute内部执行,非DF代码则会在紫色部分(“本地环境”)执行。
以DataStudio为例,如果是在DataWorks的DataStudio创建了PyODPS2/PyODPS3节点,实际跑这段代码的环境是DataWorks的调度资源组机器(gateway机器),DataWorks已经帮用户配置好了相应的runtime(pyodps依赖、python interpreter等)。因而,这些代码在执行时,行为与普通Python code的执行行为类似,import第三方包时,引用的是“本地”的包,如果您使用的是独享调度资源组,则可
通过DataWorks控制台的调度资源组运维助手,进行pip命令的下发来安装必要的三方依赖。
PyODPS DF支持对所有Sequence实现调用map方法,传入自定义函数闭包,实现对于MaxCompute表中某一列的每一个元素逐个调用自定义函数进行处理。如上述代码片段的handle函数。handle函数传入map方法时,会被提取为闭包和字节码,DF使用闭包和字节码生成一个MaxCompute的UDF,在执行时实际等效于:
select this_handle_udf(pyodps_iris.sepal_length)
由此可见,此部分的DF代码执行,发生在了MaxCompute集群内部了,即上图中的MaxCompute Executor机器上执行。
进一步来说说如果在自定义函数里使用到了三方包,因为自定义函数在MaxCompute Executor机器上执行,所以无法引用“本地环境”的包,import建议放在自定义函数内部进行,并且在DataWorks上上传三方包资源后,需要点击“提交”确保资源被正确上传到MaxCompute集群内部。