📜  Cassandra 中的用户定义函数

📅  最后修改于: 2021-09-08 16:05:06             🧑  作者: Mango

在本文中,我们将讨论如何在 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"