在本文中,我们将讨论如何在 Cassandra 中创建用户定义函数。此外,我们将看到如何修改它。我们来看一下。
首先,我们将创建一个用户定义函数(UDF) 。
让我们举一个例子,我们将创建 Max_value UDF,我们将使用它通过简单地在 UDF 中传递值来计算最大值。我们来看一下。
创建 UDF : Max_value –
CREATE FUNCTION Max_value(value1 int, value2 int)
CALLED ON NULL INPUT
RETURNS int
LANGUAGE java
AS $$return Math.max(value1, value2);$$;
现在,为了将值作为输入传递,我们将创建一个简单的表,即 UDF_Function_test,其中 function_id、num1 和 num2 是字段值。
我们来看一下。
CREATE TABLE UDF_Function_test
(
function_id int,
num1 int,
num2 int,
PRIMARY KEY(function_id)
);
现在,我们将在这里插入一些数据,我们将在 UDF函数使用这些数据来计算最大值,其中 function_id 将在 101 到 104 的范围内。
我们来看一下。
INSERT INTO UDF_Function_test(function_id, num1, num2)
VALUES(101, 400, 600);
INSERT INTO UDF_Function_test(function_id, num1, num2)
VALUES(102, 500, 400);
INSERT INTO UDF_Function_test(function_id, num2)
VALUES(103, 900);
INSERT INTO UDF_Function_test(function_id, num1)
VALUES(104, 500);
让我们验证结果并计算最大值。
SELECT function_id, num1, num2, Max_value(num1, num2)
FROM UDF_Function_test
WHERE function_id IN(101, 102, 103, 104);
输出:
function_id | num1 | num2 | udf.Max_value(num1, num2) |
---|---|---|---|
101 | 400 | 600 | 600 |
102 | 500 | 400 | 500 |
103 | null | 900 | null |
104 | 500 | null | null |
正如我们在输出表中看到的,如果输入值之一为空,那么它将返回空,因为我们使用了子句 RETURNS NULL ON NULL INPUT。
现在,我们将尝试将子句 RETURNS NULL ON NULL INPUT 更改为 CALLED ON NULL INPUT 并查看结果。
我们来看一下。
CREATE OR REPLACE FUNCTION Max_value(value1 int, value2 int)
CALLED ON NULL INPUT
RETURNS int
LANGUAGE java
AS 'return Math.max(value1, value2);';
当我们尝试执行时,它会给出以下错误。
我们来看一下。
InvalidRequest: code=2200 [Invalid query]
message="Function udf.Max_value :
(int, int) -> int can only be replaced with CALLED ON NULL INPUT"
我们将看到,一旦我们选择了 RETURNS NULL ON NULL INPUT,就无法更改它。要首先修改,我们需要删除然后再次创建 UDF函数。我们来看一下。
DROP FUNCTION Max_value;
重新创建以修改 UDF –
CREATE OR REPLACE FUNCTION Max_value(value1 int, value2 int)
CALLED ON NULL INPUT
RETURNS int
LANGUAGE java
AS 'return Math.max(value1, value2);';
现在,让我们执行并查看 UDF 的结果。
SELECT function_id, num1, num2, Max_value(num1, num2)
FROM UDF_Function_test WHERE function_id IN(1, 2, 3);
在这里我们可以看到错误是预期的,因为我们的 UDF 中没有空检查。
FunctionFailure: code=1400 [User Defined Function failure]
message="execution of 'udf.Max_value[int, int]'
failed: java.lang.NullPointerException"