如何在 BigQuery 中创建 UDF?例程名称缺失数据集

Posted

技术标签:

【中文标题】如何在 BigQuery 中创建 UDF?例程名称缺失数据集【英文标题】:How to create UDF in BigQuery? Routine name missing dataset 【发布时间】:2021-10-28 19:18:49 【问题描述】:

以下是我在 postgres db 中的工作函数的定义:

create function my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric) returns numeric
    language plpgsql
as
$$
DECLARE
    _charge numeric;
BEGIN
    IF qty = 0 THEN
        RETURN 0.00::numeric(19, 2);
    END IF;
    _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);
    RETURN (_charge + COALESCE(other_fee, 0.00))::numeric(19, 2);
END;
$$;

alter function my_function(numeric, numeric, numeric, numeric) owner to my_location;

但是当我在 BigQuery 中尝试以下操作时:

create function my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric) returns numeric
    language plpgsql
as
"""
DECLARE
    _charge numeric;
BEGIN
    IF qty = 0 THEN
        RETURN 0.00::numeric(19, 2);
    END IF;
    _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);
    RETURN (_charge + COALESCE(other_fee, 0.00))::numeric(19, 2);
END;
""";

我收到以下错误:

Routine name "my_function" missing dataset while no default dataset is set in the request.

我缺少什么命令/语法?我没有看到很多关于如何纠正这个问题的具体 sql 文档。

更新:到目前为止,我认为以下 BigQuery 是正确的,但它仍然会为浮点文字 0.00 和其他不兼容的语法提供错误

create procedure my_schema.my_function(price numeric, qty numeric, min_charge numeric, other_fee numeric)
BEGIN
    IF qty = 0 THEN
        RETURN 0.00::numeric(19, 2);
    END IF;
    _charge := GREATEST(price * qty, min_charge)::numeric(19, 2);
    RETURN (_charge + COALESCE(other_fee, 0.00))::numeric(19, 2);
END;

【问题讨论】:

1) 只需使用 dataset.function_nameproject.dataset.function_name 概念 2) 如果您想使用 BQ 脚本 - 您应该使用过程 - 请参阅 CREATE PROCEDURE statement 谢谢,我现在就试试。但是你能澄清一下我作为一个函数尝试的内容与它需要如何成为一个详细的过程之间的区别吗?这是否根本不能作为一个函数工作,它作为一个过程是否更有效,等等。 脚本在 BQ 函数中不受支持。因此,如果您的逻辑涉及脚本 - proc 是您的选择。有道理? :o) 是的,确实如此!您对我的语法需要如何更改为这个 postgres 的可比较的 bigquery 版本有任何意见吗? 您的问题专门针对Routine name missing dataset。我建议您尝试将现有代码移植到 BQ proc 中,如果您仍有任何问题 - 发布新的/单独的问题,我/我们将非常乐意提供帮助!这就是我们在 SO 上所做的 :o) 【参考方案1】: 只需使用 dataset.function_name 或 project.dataset.function_name 概念 如果您想使用 BQ 脚本 - 您应该使用过程 - 请参阅 CREATE PROCEDURE statement。 BQ 函数不支持脚本。因此,如果您的逻辑涉及脚本 - proc 是您的选择

【讨论】:

【参考方案2】:

参数化用户定义函数的示例如下:


CREATE OR REPLACE FUNCTION `Project_Name.DataSet_Name.User_Defined_Function_Name`(Field Data_Type) AS 
(
SELECT  COALESCE(Feild, 0) AS Filed2
);

【讨论】:

以上是关于如何在 BigQuery 中创建 UDF?例程名称缺失数据集的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Bigquery Legacy SQL 中创建真正的函数

在 bigquery 中创建一个 udf 以匹配数组输入

BigQuery 隐藏 UDF 实现

在 BigQuery 的查询中使用 UDF 作为列

如何通过 API 在 BigQuery 中创建没有架构的表?

如何在 Google Bigquery 中创建动态更改数据集的查询?