首页 > 编程语言 >TDengine 3.0.4.0 重要特性之 Python UDF 实战分享

TDengine 3.0.4.0 重要特性之 Python UDF 实战分享

时间:2023-07-06 15:15:05浏览次数:42  
标签:4.0 TDengine Python number UDF log lib 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,Python,number,UDF,log,lib,def,函数
From: https://www.cnblogs.com/taosdata/p/17532160.html

相关文章

  • Python3 使用confluent_kafka实现异步向Kafka中写入数据
    使用的python包pipinstallconfluent-kafka创建topic&&扩充partition#!/usr/bin/envpython#-*-coding:utf-8-*-#@Time:2023/2/616:48#@Software:PyCharm__author__="JentZhang"importjsonfromconfluent_kafka.adminimportAdminClient,......
  • Python 爬虫实战:驾驭数据洪流,揭秘网页深处
    爬虫,这个经常被人提到的词,是对数据收集过程的一种形象化描述。特别是在Python语言中,由于其丰富的库资源和良好的易用性,使得其成为编写爬虫的绝佳选择。本文将从基础知识开始,深入浅出地讲解Python爬虫的相关知识,并分享一些独特的用法和实用技巧。本文将以实际的网站为例,深入阐述各......
  • Python QT5 使用笔记[随意记]
    self.rkDialog.tableWidget.findItems() 是一个在Qt中用于在表格小部件(TableWidget)中查找匹配项的方法。它的作用是查找满足特定条件的单元格项,并返回一个包含这些项的列表。这个方法的用法如下: items=self.rkDialog.tableWidget.findItems(text,flags) 参数说明:......
  • 如何实现Python中定义一个全局列表的具体操作步骤
    Python中定义一个全局列表在Python中,全局变量是在整个程序中都可以访问的变量。全局变量可以在任何函数内部进行读取和修改。这在某些情况下是非常有用的,尤其是当我们想要在多个函数或模块之间共享数据时。如何定义一个全局列表?要在Python中定义一个全局列表,我们只需要在函数外......
  • 如何实现Python中打印数字正方形的具体操作步骤
    Python中打印数字正方形的实现简介在Python中,我们可以使用循环语句和字符串格式化来实现打印数字正方形。本文将指导你一步一步实现这个过程。步骤下面是实现打印数字正方形的步骤:步骤描述1提示用户输入正方形的边长2使用循环打印每一行的数字3在每一行中,使......
  • 如何实现Python找出字符串变量中所有大写的A.Z的具体操作步骤
    Python找出字符串变量中所有大写的A-Z作为一名经验丰富的开发者,你很荣幸地被指派教导一位刚入行的小白,告诉他如何在Python中找出字符串变量中的所有大写字母A-Z。下面是一个详细的步骤指南,帮助他完成这个任务。整体流程我们将整个过程分为以下几个步骤:步骤描述1提取......
  • Python怎么调中文 这个问题怎么解决?
    Python怎么调中文在使用Python处理中文文本时,我们常常会遇到一些编码和字符处理的问题。本文将介绍如何通过一些常用的方法和工具来解决这些问题,并提供代码示例来帮助读者更好地理解。问题描述假设我们有一个文本文件,其中包含了一些中文文本,我们想要对这些文本进行处理,例如统计......
  • 如何实现Python隐藏调用的具体操作步骤
    Python隐藏调用的实现概述Python隐藏调用是指通过某种方法,将函数或类隐藏起来,使其在外部无法直接访问和调用。这样做的目的是为了提高代码的安全性和可维护性。在本文中,我将向你介绍如何实现Python隐藏调用并提供详细的步骤和代码示例。实现步骤下面是实现Python隐藏调用的具体......
  • 如何实现Python相似度的意义的具体操作步骤
    Python相似度的意义及实现方法1.引言在日常开发中,我们经常会遇到需要比较两个或多个文本、字符串或者数据集的相似度的情况。Python提供了多种方法来计算相似度,这有助于我们解决各种实际问题,比如文本匹配、数据聚类等。本文将介绍Python相似度的意义以及实现方法,并通过一个具体......
  • 如何实现Python线性回归模型的实验报告的具体操作步骤
    Python线性回归模型的实验报告简介线性回归是一种常用的机器学习模型,用于预测一个或多个自变量与因变量之间的线性关系。它是一种简单但强大的模型,被广泛应用于各个领域。本实验报告将介绍如何使用Python实现线性回归模型,并进行实验验证其预测能力。数据集首先,我们需要准备一......