开发者社区 > 大数据与机器学习 > 大数据计算 MaxCompute > 正文

odps sql_udf 无法使用?

sql如下:
create sql function my_sum(@a BIGINT, @b BIGINT, @c BIGINT) returns @my_sum BIGINT
as begin
@temp := @a + @b;
@my_sum := @temp + @c;
end;
报错信息如下:
create sql function my_sum(@a BIGINT, @b BIGINT, @c BIGINT) returns @my_sum BIGINT
as begin
@temp := @a + @b;

OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
FAILED: ODPS-0130161:[4,2] Parse exception - invalid token '', expect 'END'

无法解析第一个分号之后的内容

展开
收起
游客sfkneoqjlyfcu 2024-01-12 11:05:28 99 0
3 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您提供的错误信息,问题出在创建SQL函数的语法上。在ODPS SQL中,创建函数时需要使用CREATE FUNCTION语句,而不是CREATE SQL FUNCTION。请尝试将您的SQL代码修改为以下格式:

    CREATE FUNCTION my_sum(@a BIGINT, @b BIGINT, @c BIGINT) RETURNS @my_sum BIGINT
    AS
    BEGIN
        DECLARE @temp BIGINT;
        SET @temp = @a + @b;
        SET @my_sum = @temp + @c;
        RETURN @my_sum;
    END;
    

    这样应该可以解决您遇到的问题。

    2024-01-12 21:45:00
    赞同 展开评论 打赏
  • 您提供的SQL函数定义看起来是在尝试模仿存储过程的语法,但在标准SQL或阿里云MaxCompute (原名ODPS) 中并不完全适用。MaxCompute使用的是MapReduce风格的数据处理模型,其SQL方言与传统的关系型数据库SQL有所差异。

    针对上述错误,MaxCompute不支持在SQL函数内声明和赋值局部变量,然后通过多行逻辑来计算结果。在MaxCompute中,自定义函数通常是单行表达式,用于简单操作。

    若要在MaxCompute中创建一个接受多个BIGINT参数并返回它们总和的函数,应当编写如下的简单聚合函数:

    CREATE FUNCTION my_sum(a BIGINT, b BIGINT, c BIGINT)
    RETURNS BIGINT
    BEGIN
      RETURN a + b + c;
    END;
    

    由于MaxCompute SQL的限制,上述语法可能仍不被支持,实际上MaxCompute可能需要通过UDF(User Defined Function)以Java等方式实现复杂函数功能。对于简单的加法操作,直接在查询语句中进行计算即可,无需创建自定义函数。
    image.png

    2024-01-12 17:10:11
    赞同 展开评论 打赏
  • 在阿里云MaxCompute(原名ODPS)中,函数定义的语法并不支持标准SQL中的存储过程或者用户自定义函数(UDF)的这种写法。MaxCompute SQL更倾向于基于MapReduce模型的大规模分布式计算,其自定义函数通常指的是UDF(User Defined Function),并且是以Java、Python等方式编写的,并非直接在SQL中定义。

    对于你给出的SQL函数定义,正确的做法应该是创建一个用户自定义函数,但不是在SQL中定义,而是编写一个Java类或者Python脚本,然后在MaxCompute中注册这个函数。

    例如,如果你希望实现一个加法函数,你需要创建一个Java类,继承com.aliyun.odps.udf.UDF类,并实现evaluate方法,然后将这个类打包成JAR文件上传到MaxCompute项目,并注册这个函数。

    对于你的需求,一个简单的加法函数在MaxCompute中的Java实现示例(假设三个bigint参数相加):

    import com.aliyun.odps.udf.UDF;
    import com.aliyun.odps.udf.UDFException;
    
    public class MySum extends UDF {
    
        public Long evaluate(Long a, Long b, Long c) throws UDFException {
            return a + b + c;
        }
    }
    

    然后将这个类打包成jar,上传到MaxCompute并创建函数:

    CREATE FUNCTION my_sum AS 'com.example.MySum';
    
    2024-01-12 11:47:34
    赞同 1 展开评论 打赏

MaxCompute(原ODPS)是一项面向分析的大数据计算服务,它以Serverless架构提供快速、全托管的在线数据仓库服务,消除传统数据平台在资源扩展性和弹性方面的限制,最小化用户运维投入,使您经济并高效的分析处理海量数据。

相关产品

  • 云原生大数据计算服务 MaxCompute
  • 相关电子书

    更多
    Data+AI时代大数据平台应该如何建设 立即下载
    大数据AI一体化的解读 立即下载
    极氪大数据 Serverless 应用实践 立即下载