首页 > 解决方案 > 未找到用户定义的函数

问题描述

我创建了一个永久 UDF 函数来验证这样的电子邮件:

create or replace function 
`project-name`.udf_library.is_valid_email(text STRING)
returns Bool
as (REGEXP_CONTAINS(text, r"valid_regex"));

并使用以下查询对其进行了测试,并像魅力一样工作:

with emails as
(select 'alberto@example.com' as email
union all
select 'foobar' as email
union all
select 'disposable.style.email.with+symbol@example.com' as email
union all
select '"john..doe"@example.org' as email
union all
select 'i_like_underscore@but_its_not_allow_in_this_part.example.com' as email)
select email, `project-name`.udf_library.is_valid_email(email) as validEmail from emails
Row email                                                   validEmail 
1   alberto@example.com                                           true
2   foobar                                                       false
3   disposable.style.email.with+symbol@example.com                true
4   "john..doe"@example.org                                       true
5   i_like_underscore@but_its_not_allow_in_this_part.example.com false

但是当我查询一个表并尝试使用这样的函数时

SELECT email, `project-name`.udf_library.is_valid_email(email) as validEmail 
FROM `project-name.Mydataset.MyTable`

我明白了:

未找到函数:project-name[1:15] 处的 .udf_library.is_valid_email

如果我将它创建为临时函数,它确实有效,但这违背了拥有永久 UDF 的全部目的

有任何想法吗?

谢谢

标签: google-bigquerybigquery-udf

解决方案


请检查数据集的位置,project-name.Mydataset并且project-name.udf_library它们必须位于同一区域才能使您的最后一个查询起作用。

用于准备数据的查询WITH有效,因为它被路由到 UDF 所在的区域。最后一个查询可能被路由到数据所在的位置。


推荐阅读