首页 > 编程语言 >一文教你玩转 TDengine 3.0.4.0 重要特性 Python UDF

一文教你玩转 TDengine 3.0.4.0 重要特性 Python UDF

时间:2023-06-04 23:03:19浏览次数:44  
标签:4.0 TDengine 05 Python number UDF log def 函数








TDengine 3.0.4.0 发布了一个重要特性:支持用 Python 语言编写的自定义函数(UDF)。这个特性极大节省了 UDF 开发的时间成本。作为时序大数据处理平台,不支持 Python UDF 显然是不完整的。UDF 在实现自己业务中特有的逻辑时非常有用,比如量化交易场景计算自研的交易信号。本文内容由浅入深包括 4 个示例程序:

1


定义一个只接收一个整数的标量函数:输入 n, 输出 ln(n^2 + 1)。

2


定义一个接收 n 个整数的标量函数, 输入 (x1, x2, ..., xn), 输出每个值和它们的序号的乘积的和:x1 + 2 * x2 + ... + n * xn。

3


定义一个标量函数,输入一个时间戳,输出距离这个时间最近的下一个周日。完成这个函数要用到第三方库 moment。我们在这个示例中讲解使用第三方库的注意事项。

4


定义一个聚合函数,计算某一列最大值和最小值的差,  也就是实现 TDengien 内置的 spread 函数。

同时也包含大量实用的 debug 技巧。

本文假设你用的是 Linux 系统,且已安装好了 TDengine 3.0.4.0+ 和 Python 3.x。








示例一

最简单的 UDF

编写一个只接收一个整数的 UDF 函数:输入 n, 输出 ln(n^2 + 1)。

首先编写一个 Python 文件,存在系统某个目录,比如 /root/udf/myfun.py 内容如下:

from math import log


def init():
    pass


def destroy():
    pass


def process(block):
    rows, _ = block.shape()
    return [log(block.data(i, 0) ** 2 + 1) for i in range(rows)]

这个文件包含 3 个函数, init 和 destroy 都是空函数,它们是 UDF 的生命周期函数,即使什么都不做也要定义。最关键的是 process 函数, 它接受一个数据块,这个数据块对象有两个方法

  1. shape() 返回数据块的行数和列数
  2. data(i, j) 返回 i 行 j 列的数据

标量函数的 process 方法传入的数据块有多少行,就需要返回多少个数据。上述代码中我们忽略的列数,因为我们只想对每行的第一个数做计算。

接下来我们在时序数据库(Time Series Database) TDengine 中创建对应的 UDF 函数,执行下面语句:

create function myfun as '/root/udf/myfun.py' outputtype double language 'Python'

taos> create function myfun as '/root/udf/myfun.py' outputtype double language 'Python';
Create OK, 0 row(s) affected (0.005202s)

看起来很顺利,接下来 show 一下系统中所有的自定义函数,确认创建成功:

taos> show functions;
              name              |
=================================
 myfun                          |
Query OK, 1 row(s) in set (0.005767s)

接下来就来测试一下这个函数,测试之前先执行下面的 SQL 命令,制造些测试数据:

create database test;
create table t(ts timestamp, v1 int, v2 int, v3 int);
insert into t values('2023-05-01 12:13:14', 1, 2, 3);
insert into t values('2023-05-03 08:09:10', 2, 3, 4);
insert into t values('2023-05-10 07:06:05', 3, 4, 5);

测试 myfun 函数:

taos> select myfun(v1, v2) from t;


DB error: udf function execution failure (0.011088s)

不幸的是执行失败了,什么原因呢?

查看 udfd 进程的日志: /var/log/taos/udfd.log 发现以下错误信息:

05/24 22:46:28.733545 01665799 UDF ERROR can not load library libtaospyudf.so. error: operation not permitted
05/24 22:46:28.733561 01665799 UDF ERROR can not load python plugin. lib path libtaospyudf.so

错误很明确:没有加载到 Python 插件 libtaospyudf.so, 看官方文档原来是要先安装 taospyudf 这个 Python 包。于是:

pip3 install taospyudf

安装过程会编译 C++ 源码,因此系统上要有 cmake 和 gcc。编译生成的 libtaospyudf.so 文件自动会被复制到 /usr/local/lib/ 目录,因此如果是非 root 用户,安装时需加 sudo。安装完可以检查这个目录是否有了这个文件:

root@slave11 ~/udf $ ls -l /usr/local/lib/libtaos*
-rw-r--r-- 1 root root 671344 May 24 22:54 /usr/local/lib/libtaospyudf.so

这时再去执行 SQL 测试 UDF,会发现报同样的错误,原因是新安装的共享库还未生效,还需执行命令:

ldconfig

此时再去测试 UDF,终于成功了:

taos> select myfun(v1) from t;
         myfun(v1)         |
============================
               0.693147181 |
               1.609437912 |
               2.302585093 |

至此,我们完成了第一个 UDF

标签:4.0,TDengine,05,Python,number,UDF,log,def,函数
From: https://blog.51cto.com/tdengine/6412785

相关文章

  • python3类型标记
    1、介绍python是解释型数据类型,变量名称所指向的数据的类型由赋予的数据决定。一般情况下,ide是能够结合上下文环境分析确定变量类型的,进而提供其类型对应的属性和方法。但是,对于另外一些场景,则无法进行直接分析。类型标记机制,允许开发者对变量名称进行类型标记,以帮助ide提示。......
  • python计算收益率
     importpandasaspdimportnumpyasnpimportwarningswarnings.filterwarnings("ignore")pd.options.plotting.backend="plotly"#从csv文件获取数据data=pd.read_csv('testPandasShit.csv',sep='\s+')pd.set_option('......
  • 【python基础】复杂数据类型-列表类型(元组)
    1.初识元组列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的。然而,有时候需要创建一系列不可修改的元素,元组可以满足这种需求python将不能修改的值称为不可变的,而不可变的列表被称为元组。元组看起来犹如列表,但使用圆括号而不是方括号来标识。其语法格......
  • 【python基础】复杂数据类型-列表类型
    复杂数据类型-列表类型-学习目录列表-增删改查列表-排序/长度/遍历列表-数值列表列表-列表切片列表-元组......
  • 让你的代码动起来:Python进度条神器tqdm详解及应用实例
    各位Python高手,今天我要给大家介绍一个好用的库,它就是:tqdmtqdm在阿拉伯语中的意思是"进展",所以这个库也被称为"快速进展条"。不得不说,这个名字真的很有创意!让我们想象一下,你正在运行一个耗时的数据处理任务或者训练一个复杂的深度学习模型。你坐在那里,盯着屏幕,焦急地等待程序......
  • python打开文件时的mode选择
    常用:追加:a覆盖:wModeDescriptionExamplerReadmode.Opensthefileforreading(defaultmode).Ifthefiledoesn’texist,anerrorwillberaised.file=open('example.txt','r')wWritemode.Opensthefileforwriting.Ifth......
  • python tkinter scale 滑动选择刻度条
    tkinter.Scale(d_f,from_=0,to=20,tickinterval=5,orient="horizontal")1.参数汇总归纳总结Scale组件中一些常用的参数以及用法。 2.方法汇总coords(value=None)获得当前滑块的位置对应Scale组件左上角的相对坐标如果设置value参数,则返回当滑块所在该位置......
  • 基于Selenium库的python爬虫脚本,爬取painterest上的图片
    基于Selenium库的python爬虫脚本,爬取painterest上的图片问题背景Pinterest是一个社交媒体平台,它提供了一个虚拟的个人兴趣画板,让用户可以收集和分享他们喜欢的图片、视频和链接。上面有许多优秀的图片供浏览和下载,但是一个个点图片下载非常麻烦。于是想要用Python语言写一个自......
  • Python爬虫入门六之Cookie的使用
     大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用。为什么要使用Cookie呢?Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个......
  • python中生产者和消费者理论
    1.模型理论生产者消费者他是一个概念,(由于生产者消费者模型并不局限于某一类技术,因此,有多种实现方式)所以,代码很简单,所以这里首先要弄懂理论。 1.1 生产者消费者模型模型指的是一种解决问题的套路。 1.2生产者消费者模型中包含两类重要角色一类叫生产者,另一类叫消费者......