在实体化视图中使用用户定义的函数 (UDF) - Amazon Redshift

在实体化视图中使用用户定义的函数 (UDF)

您可以在 Amazon Redshift 实体化视图中使用标量 UDF。在 Python 或 SQL 中定义它们,并在实体化视图定义中引用。

在实体化视图中引用 UDF

以下过程显示如何在实体化视图定义中使用执行简单算术比较的 UDF。

  1. 创建一个表,以在实体化视图定义中使用。

    CREATE TABLE base_table (a int, b int);
  2. 在 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;
  3. 创建一个实体化视图,该视图从您创建的表中进行选择并引用 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;
  4. 向表中添加数据并刷新实体化视图。

    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;
  5. 查询实体化视图中的数据。

    SELECT * FROM mv_python_udf ORDER BY a;

    查询的结果应如下所示:

    a ----- false false true

    对于最后一组值,这将返回 true,因为列 a 的值 (4) 大于列 b 的值 (2)。

  6. 或者,您可以查询引用 SQL UDF 的实体化视图。SQL 函数的结果与 Python 版本的结果匹配。

    SELECT * FROM mv_sql_udf ORDER BY a;

    查询的结果应如下所示:

    a ----- false false true

    对于要比较的最后一组值,这将返回 true

  7. 使用带 CASCADE 的 DROP 语句可删除用户定义的函数以及引用该函数的实体化视图。

    DROP FUNCTION udf_python_bool(int, int) CASCADE;
    DROP FUNCTION udf_sql_bool(int, int) CASCADE;