【问题标题】:Query `list stage` in Snowflake UDF在 Snowflake UDF 中查询“list stage”
【发布时间】:2021-07-01 15:38:32
【问题描述】:

我正在尝试编写一个 Snowflake UDF,它接受阶段名称和特定文件夹名称作为输入参数,并返回最新的文件 ID(从完整文件名中剥离)作为输出。谁能帮我用一个简单的代码来实现这一点?

【问题讨论】:

  • 感谢您的回复。我也可以通过存储过程获得结果,但要求是有一个 UDF,以便它可以在查询中使用。
  • 您不能在 UDF 中运行 LIST 命令。 UDF 没有用于在存储过程中运行查询的 JavaScript“雪花”对象。要作为查询的一部分运行,您可以先运行LIST 命令,然后使用TABLE(RESULT_SCAN(LAST_QUERY_ID())) 查询结果。

标签: snowflake-cloud-data-platform


【解决方案1】:

我不确定您是否需要 UDF 或存储过程。创建的语法类似,所以我认为这会有所帮助。这是一个存储过程,它将从给定的阶段和路径获取最新的暂存文件。请注意查询中的limit 1,多个暂存文件可能共享相同的最后修改日期,而此过程返回标量(单个)值。

存储过程定义

create or replace procedure "MYDB"."MYSCHEMA"."LATEST_STAGED_FILE"(stage_name text, folder text) 
returns string not null 
language javascript  
execute as caller 

as 
$$ 
var sql_text = "list @" + STAGE_NAME + "/" + FOLDER ; 
var sql_command0 = snowflake.createStatement({ sqlText: sql_text}); 
var sql_command1 = snowflake.createStatement({ sqlText:`SELECT "name" FROM table(result_scan(last_query_id())) WHERE "last_modified" = (select MAX("last_modified") from table(result_scan(last_query_id()))) LIMIT 1;`});

try { 
    sql_command0.execute();
    var resultSet = sql_command1.execute(); 
    while(resultSet.next()) 
    {  
        var resultFile = resultSet.getColumnValue('name').split("/")
        return resultFile[resultFile.length - 1]
    }
}
catch (err) { 
    return "Failed: " + err;
}
$$;

然后你可以像这样调用存储过程

call "MYDB"."MYSCHEMA"."LATEST_STAGED_FILE"('MYDB.MYSCHEMA.MYSTAGE', 'mypath/myotherpath');

参考文献

select from list @

list stage via SP

【讨论】:

    猜你喜欢
    • 2019-03-12
    • 2023-01-13
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多