在实体化视图中使用用户定义的函数 (UDF)
您可以在 Amazon Redshift 实体化视图中使用标量 UDF。在 Python 或 SQL 中定义它们,并在实体化视图定义中引用。
在实体化视图中引用 UDF
以下过程显示如何在实体化视图定义中使用执行简单算术比较的 UDF。
创建一个表,以在实体化视图定义中使用。
CREATE TABLE base_table (a int, b int);
在 Python 中创建一个标量用户定义函数,该函数返回一个布尔值,指示某个整数是否大于比较的整数。
CREATE OR REPLACE FUNCTION udf_python_bool(x1 int, x2 int) RETURNS bool IMMUTABLE AS $$ return x1 > x2 $$ LANGUAGE plpythonu;
或者,您可以使用 SQL 创建功能相似的 UDF,用来将结果与第一个数进行比较。
CREATE OR REPLACE FUNCTION udf_sql_bool(int, int) RETURNS bool IMMUTABLE AS $$ select $1 > $2; $$ LANGUAGE SQL;
创建一个实体化视图,该视图从您创建的表中进行选择并引用 UDF。
CREATE MATERIALIZED VIEW mv_python_udf AS SELECT udf_python_bool(a, b) AS a FROM base_table;
或者,您可以创建引用 SQL UDF 的实体化视图。
CREATE MATERIALIZED VIEW mv_sql_udf AS SELECT udf_sql_bool(a, b) AS a FROM base_table;
向表中添加数据并刷新实体化视图。
INSERT INTO base_table VALUES (1,2), (1,3), (4,2);
REFRESH MATERIALIZED VIEW mv_python_udf;
或者,您可以刷新引用 SQL UDF 的实体化视图。
REFRESH MATERIALIZED VIEW mv_sql_udf;
查询实体化视图中的数据。
SELECT * FROM mv_python_udf ORDER BY a;
查询的结果应如下所示:
a ----- false false true
对于最后一组值,这将返回
true
,因为列a
的值 (4) 大于列b
的值 (2)。-
或者,您可以查询引用 SQL UDF 的实体化视图。SQL 函数的结果与 Python 版本的结果匹配。
SELECT * FROM mv_sql_udf ORDER BY a;
查询的结果应如下所示:
a ----- false false true
对于要比较的最后一组值,这将返回
true
。 使用带 CASCADE 的 DROP 语句可删除用户定义的函数以及引用该函数的实体化视图。
DROP FUNCTION udf_python_bool(int, int) CASCADE;
DROP FUNCTION udf_sql_bool(int, int) CASCADE;