Python语言标量函数
下面的示例展示了一个简单的标量函数,用于对一组数字求和。 本例从一开始就构建了一个简单的 AE。 它使用以下文件名:"applyop.py
代码
- 从 "
nzae.Ae
派生一个类。 The base class handles most of the work, so typically you call theclass-method "run()"
.run()
函数实例化了类,设置了错误处理,并调用了相应的派生函数。 对于像本例这样基于 UDF 的 AE,必须重载 "_getFunctionResult()
函数,因为每一行输入都要调用一次。 将以下代码保存到名为 "applyop.py的文件中:import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # OUR CUSTOM CODE WILL GO HERE. ApplyOpUdfAe.run()
- 完成自定义Python代码。 在此 UDF 中,您需要输入一个字符串运算符(加号 (+) 表示相加,星号 (*) 表示相乘)以及两个整数。 代码会返回乘积或整数之和。 在 SQL 中,可以通过以下任一种方法调用简单的版本:
或SELECT applyop('+', 3, 5);
SELECT applyop('*', 3, 5);
虽然上述例子只有一个输入,但核动力源系统处理的是输入流。 因此,新农保系统更容易使用:SELECT applyop(mytable.operator, mytable.value1, mytable.value2) FROM mytable;
在第一个例子中,NPS 系统将常数 "+"、3 和 5 转化为长度为 1 的包含三个元素的数据流。 有一行被 "
_getFunctionResult()
"看到",其中有三个元素。 在内部,所有提到的情况都是以同样的方式处理的,可以假设 "applyop
AE 有多个输入。 - 输入自定义代码来处理一行输入,因为需要循环处理输入,以便一次将一行输入交给函数:
import nzae class ApplyOpUdfAe(nzae.Ae): def _getFunctionResult(self, row): # BREAK APART OUR ROW OF INPUT. operator, leftInput, rightInput = row # HANDLE ADDITION. if operator == "+": return leftInput + rightInput # HANDLE MULTIPLICATION. if operator == "*": return leftInput * rightInput # ERROR ON ALL OTHER. self.userError("Unhandled operator to ApplyOp: '" + operator + "'.") ApplyOpUdfAe.run()
函数 "
self.userError()
向 SQL 用户报告错误。 无论 "_getFunctionResult()
返回什么,都是 SQL 操作的结果。 由于这是作为 UDF 运行的,因此结果中只能有一列。 后面的示例演示了如何使用 UDTF 输出多列。 代码完成后,必须进行部署和注册。
编译
PythonAE 不需要编译。
部署
虽然PythonAE 不需要编译,但需要部署。 compile_ae命令仍与 "
--template
部署选项一起使用,以将脚本部署到共享导出驱动器上的默认位置。$NZ_EXPORT_DIR/ae/utilities/bin/compile_ae --language python64 \
--template deploy ./applyop.py --version 3
注册
注册Python文件:
$NZ_EXPORT_DIR/ae/utilities/bin/register_ae --language python64 --version 3 \
--template udf --exe applyop.py --sig "applyop(varchar(1), int4, int4)" \
--return int4
正在运行
现在可以在 SQL 中运行 AE:
SELECT applyop('+', 4, 10);
APPLYOP
---------
14
(1 row)
请注意,要验证 "
_getFunctionResult()
中的类型,需要调用 "self.userError()
。 以下示例会引发错误:SELECT applyop('-', 1, 2);
ERROR: Unhandled operator TO ApplyOp: '-'.