

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://www.amazonaws.cn/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

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

## 在实体化视图中引用 UDF
在实体化视图中引用 UDF

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

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

   ```
   CREATE TABLE base_table (a int, b int);
   ```

1. 在 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;
   ```

1. 创建一个实体化视图，该视图从您创建的表中进行选择并引用 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;
   ```

1. 向表中添加数据并刷新实体化视图。

   ```
   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;
   ```

1. 查询实体化视图中的数据。

   ```
   SELECT * FROM mv_python_udf ORDER BY a;
   ```

   查询的结果应如下所示：

   ```
   a
   -----
   false
   false
   true
   ```

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

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

   ```
   SELECT * FROM mv_sql_udf ORDER BY a;
   ```

   查询的结果应如下所示：

   ```
   a
   -----
   false
   false
   true
   ```

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

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

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

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