在 citus (postgres) 上创建分布式 table 时出现错误
I get error when create distributed table on citus (postgres)
我在 Citus 上创建了一个 table:
CREATE TABLE myschema.mytable
然后我创建了从 table myschema.mytable:
获取数据的函数
CREATE FUNCTION myschema.myfunction(id INT)
RETURNS INT AS $$
DECLARE approved_count INT;
BEGIN
SELECT COUNT(id) INTO approved_count
FROM myschema.mytable
WHERE id = AND is_deleted = FALSE AND is_flagged = TRUE;
RETURN approved_count;
END;
$$ LANGUAGE plpgsql
然后我在table myschema.mytable上添加了约束:
ALTER TABLE myschema.mytable ADD CONSTRAINT myconstraint CHECK ((myschema.myfunction()=(0)));
以上所有查询均已成功执行。
最后,我创建了一个分布式的table:
SELECT create_distributed_table('myschema.mytable', 'tenant_id');
我得到了错误:
ERROR: function myschema.myfunction() does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
CONTEXT: while executing command on 10.0.0.***:****
SQL state: 42883
我尝试 运行 以其他顺序查询。我创建了一个 table,分发了 table,并成功运行。但是我无法添加约束并得到相同的错误。
据我所知,我的工作人员看不到我的功能。我该如何解决这个问题?
Citus 当前不会将 CREATE FUNCTION
查询传播到工作节点。您需要自己在workers中手动创建函数。
您还可以使用以下查询在工作节点中手动创建函数:
SELECT *
FROM run_command_on_workers($cmd$
CREATE FUNCTION myschema.myfunction(id INT) RETURNS INT AS
$$ DECLARE approved_count INT;
BEGIN
SELECT
COUNT(id)
INTO
approved_count
FROM
myschema.mytable
WHERE
id =
AND is_deleted = FALSE
AND is_flagged = TRUE;
RETURN approved_count;
END;
$$ LANGUAGE plpgsql
$cmd$);
您可能还需要在工作节点上创建 myschema
(取决于您的 Citus 版本)。您也可以使用 run_command_on_workers()
udf 和 CREATE SCHEMA IF NOT EXISTS
命令来执行此操作。
您可以查看 run_command_on_workers()
here 的文档。
仅供参考:我目前正在研究一项在工作节点中分发功能的功能。我们计划在下一个 Citus 主要版本中发布它
编辑:create_distributed_function
Citus 中有 UDF >= v9.0
您可以在 https://docs.citusdata.com/en/v9.0/develop/api_udf.html#create-distributed-function and some more in https://docs.citusdata.com/en/v9.0/faq/faq.html#how-do-i-create-database-roles-functions-extensions-etc-in-a-citus-cluster
查看文档
我在 Citus 上创建了一个 table:
CREATE TABLE myschema.mytable
然后我创建了从 table myschema.mytable:
获取数据的函数CREATE FUNCTION myschema.myfunction(id INT)
RETURNS INT AS $$
DECLARE approved_count INT;
BEGIN
SELECT COUNT(id) INTO approved_count
FROM myschema.mytable
WHERE id = AND is_deleted = FALSE AND is_flagged = TRUE;
RETURN approved_count;
END;
$$ LANGUAGE plpgsql
然后我在table myschema.mytable上添加了约束:
ALTER TABLE myschema.mytable ADD CONSTRAINT myconstraint CHECK ((myschema.myfunction()=(0)));
以上所有查询均已成功执行。
最后,我创建了一个分布式的table:
SELECT create_distributed_table('myschema.mytable', 'tenant_id');
我得到了错误:
ERROR: function myschema.myfunction() does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
CONTEXT: while executing command on 10.0.0.***:****
SQL state: 42883
我尝试 运行 以其他顺序查询。我创建了一个 table,分发了 table,并成功运行。但是我无法添加约束并得到相同的错误。
据我所知,我的工作人员看不到我的功能。我该如何解决这个问题?
Citus 当前不会将 CREATE FUNCTION
查询传播到工作节点。您需要自己在workers中手动创建函数。
您还可以使用以下查询在工作节点中手动创建函数:
SELECT *
FROM run_command_on_workers($cmd$
CREATE FUNCTION myschema.myfunction(id INT) RETURNS INT AS
$$ DECLARE approved_count INT;
BEGIN
SELECT
COUNT(id)
INTO
approved_count
FROM
myschema.mytable
WHERE
id =
AND is_deleted = FALSE
AND is_flagged = TRUE;
RETURN approved_count;
END;
$$ LANGUAGE plpgsql
$cmd$);
您可能还需要在工作节点上创建 myschema
(取决于您的 Citus 版本)。您也可以使用 run_command_on_workers()
udf 和 CREATE SCHEMA IF NOT EXISTS
命令来执行此操作。
您可以查看 run_command_on_workers()
here 的文档。
仅供参考:我目前正在研究一项在工作节点中分发功能的功能。我们计划在下一个 Citus 主要版本中发布它
编辑:create_distributed_function
Citus 中有 UDF >= v9.0
您可以在 https://docs.citusdata.com/en/v9.0/develop/api_udf.html#create-distributed-function and some more in https://docs.citusdata.com/en/v9.0/faq/faq.html#how-do-i-create-database-roles-functions-extensions-etc-in-a-citus-cluster