PyODPS 中使用 Python UDF

PyODPS 中使用 Python UDF 包含两方面,一个是直接使用,也就是在 MaxCompute SQL 中使用;一个是间接的方式,也就是 PyODPS DataFrame,这种方式你不需要直接写 Python UDF,而是写普通的 Python 函数或者类。下面我们分开说明。

作为准备工作,我们需要 ODPS 入口,可以通过直接初始化,或者使用 room 机制 加载。

from odps import ODPS

o = ODPS('your-access-id', 'your-access-key', 'your-project')

MaxCompute SQL 中使用 Python UDF

首先,我们需要写一个 Python 文件,假设我们就是把某一列按 csv 格式放的一列转成 json 格式。

import json

from odps.udf import annotate

@annotate('string->string')
class Transform(object):
    def evaluate(self, x):
        columns = list('abc')
        d = dict(zip(columns, x.split(',')))
        return json.dumps(d)

假设这个文件叫 my.py,接下来我们就需要创建 py 资源。

r = o.create_resource('csv_to_json.py', 'py', fileobj=open('my.py'))

fileobj 参数也可以是 str 类型,就是表示文件的内容

接着我们就可以创建 Python UDF 了。

o.create_function('csv_to_json', class_type='csv_to_json.Transform', resources=[r])

这里我们指定了函数名叫 csv_to_json,主类使我们上传的 csv_to_json.py 文件里的 Transform 类。

现在我们就可以在 MaxCompute SQL 中调用这个 UDF 了。

o.execute_sql('select csv_to_json(raw) from pyodps_test_udf')

这样我们就完成了在 PyODPS 中使用 MaxCompute SQL + Python UDF 的整个过程。

PyODPS DataFrame

对于 PyODPS DataFrame 来说,用户只需要写普通的 Python 函数或者类,在函数或者类里,甚至可以读取全局变量,这样给开发带来了极大的方便。

和上面的例子目标相同,我们定义一个 transform 函数即可。然后我们对于 DataFrame 的一列调用 map 方法来应用这个函数。

passed_columns = list('abc')  # 可以从数据库中读取或者写死

def transform(x):
    import json
    d = dict(zip(passed_columns, x.split(',')))
    return json.dumps(d)

df.raw.map(transform)
In [30]: df
     raw
0  1,2,3
1  4,5,6
2  7,8,9

In [31]: df.raw.map(transform)
                              raw
0  {"a": "1", "c": "3", "b": "2"}
1  {"a": "4", "c": "6", "b": "5"}
2  {"a": "7", "c": "9", "b": "8"}

实际上,PyODPS DataFrame 在用 MaxCompute 执行的时候,也会创建 Python UDF 来实现这个功能,但用户不需要去创建文件、资源和函数这些过程,一切都是 Python 原生函数和类,整个过程相当顺畅。

另外可以看到,在上面的 my.py 里,我们也是定义了一个 columns 参数的,而如果这个参数是通过变量传进去的话,在 Python UDF 里非常麻烦,可能常常需要用一些 tricky 的方法,比如写到某个文件资源,然后在 UDF 里读取之类的。而对于 DataFrame 来说,完全没有这个问题,我们可以自由读取全局变量。

不过要注意的是,这个全局变量是被序列化到各个机器上的,所以你修改它不会全局生效。

好了,还有什么问题可以随时和我们取得联系。

时间: 2025-01-31 17:08:02

PyODPS 中使用 Python UDF的相关文章

MaxCompute Studio使用心得系列6——一个工具完成整个Python UDF开发

2017/12/20 北京云栖大会上阿里云MaxCompute发布了最新的功能Python UDF,万众期待的功能终于支持啦,我怎么能不一试为快,今天就分享如何通过Studio进行Python udf开发. 前置条件 了解到,虽然功能发布,不过还在公测阶段,如果想要使用,还得申请开通:https://page.aliyun.com/form/odps_py/pc/index.htm.这里我就不介绍申请开通具体流程了. 环境准备 MaxCompute Studio支持Python UDF开发,前提

在Linux中通过Python脚本访问mdb数据库的方法

  这篇文章主要介绍了在Linux中通过Python脚本访问mdb数据库的方法,本文示例基于debian系的Linux系统,需要的朋友可以参考下 在 linux 系统中连接 mdb 数据库,直接连接的话,mdb 默认的驱动无法识别非 windows 的路径, 所以不能使用常规的连接方式 ? 1 DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:dirfile.mdb 安装 这里我们需要借助一些库来实现第三方的驱动 我们需要安装这些包:mdbtools,

c++-关于C++中嵌入python 结巴分词

问题描述 关于C++中嵌入python 结巴分词 如题,在c++中想用到python的结巴分词库,我想的是把字符串传入py脚本,分词后再返回,但是会出现各种问题,而且jieba的对象类型不好处理,有没有大神可以提供下思路,有可行代码提供的,直接给分.跪求-- 解决方案 python结巴分词python中文分词:结巴分词 解决方案二: 如果觉得C++直接调用py脚本来处理,对象类型等不是很好处理,可以用一个中间介质的方式 把字符串写入文件,然后调用py脚本来处理,同样py脚本处理完写入另一个文件,

同样的python程序在命令行中与python shell,eclipse中的运行结果不一样

问题描述 同样的python程序在命令行中与python shell,eclipse中的运行结果不一样 我在做leetcode题的时候写的python程序中包含如下一段代码: res = int(a, 2) + int(b, 2) ans = [] while res > 0: t = str(res % 2) 结果我先在python shell里面运行这个程序会报错: 然而我在python shell里面运行类似的代码,也把一个整型存放到res里,就没有问题: 同样在eclipse中运行也是正

debug-如何在Qt中调用Python

问题描述 如何在Qt中调用Python 在网上有c++(vs环境下和vc++环境下)调用python的方法,但是我现在用Qt开发一个Python的debugger,有些东西必须要使用Python本身的东西,所以必须要在Qt中调用python.现在向各位大牛们求助,希望大家帮帮忙,要不毕设就死定了... 发一下我找到的几个帖子:http://wenku.baidu.com/link?url=M3K_27I8yLSHXKWOVbpoyD15Tqys271gqvLHFdPgJt4uaiUeeXcbIt

linu-在CentOS中升级Python的库问题

问题描述 在CentOS中升级Python的库问题 我用的系统是Linux的CentOS版本,它自带了python环境,是2.6的,我安装的软件需要2.7的环境,下载了python的tar包.一路.configure,make,make install下来,python安装完了,并在/usr/bin里建立了软连接指向/usr/local/bin下的python2.7,我运行python,环境变成2.7的了.但是我发现执行以下的语句不能导入包IMAP4_SSL,from imaplib impor

在Mac OSX中搭建Python集成开发环境图解

本篇博客分享如何在Mac OSX系统中搭建Python集成开发环境 首先到Python官网下载python,python官网链接 这里选择下载Python2.7.9版本,下载完成之后安装: 安装成功,打开终端: 下面下载python开发的ide,http://www.jetbrains.com/pycharm/ 下载专业版,有30天的免费试用,足够我们学习python了. 安装,将Pycharm拖动到mac应用程序中 创建第一个Python项目: 运行python文件 来源:51CTO

《Python硬件编程实战》——2.8 在Mac中安装Python

2.8 在Mac中安装Python 由于Mac系统的基本架构和Linux系统比较类似,换句话说,Mac系统的底层架构和Linux架构是一样的,此特性用于此处的讨论,如何在Mac上安装Python,其结论也和Linux系统中是一样的:Mac系统中也已经内置了Python了,如图2-11所示.对于初学者也无需再安装,直接拿来使用即可. 至此,对于如何在主流的操作系统中安装Python的问题就都已解释完毕,接下来就是介绍如何开发Python了.

在IE中使用Python作为开发脚本

在IE中使用Python作为开发脚本 目前IE支持的客户端脚本语言常见的有VBScript和JavaScript,这两种脚本语言在操作页面元素方面基本能满足一般应用的需要,可通过和COM集成来获得扩展功能. 本文提供一种将Python作为IE客户端脚本语言的方法,利用Python的简洁和可扩展性使web应用在客户端可实现更好的交互.也可用Python内置的网络功能,更容易地实现AJAX的功能. 根据在IE中使用javascript的语法,可以猜到在IE中使用Python的语法是: <script