如何在雪花任务语句中使用复制存储集成?

Posted

技术标签:

【中文标题】如何在雪花任务语句中使用复制存储集成?【英文标题】:How to use copy Storage Integration in a Snowflake task statement? 【发布时间】:2020-09-10 15:28:36 【问题描述】:

我正在测试 SnowFlake。为此,我在 GCP 上创建了一个 SnowFlake 实例。

其中一项测试是尝试每天从 STORAGE INTEGRATION 加载数据。

为此,我生成了 STORAGE INTEGRATIONstage

我测试了副本

copy into DEMO_DB.PUBLIC.DATA_BY_REGION from @sg_gcs_covid pattern='.*data_by_region.*'

一切顺利。

现在是时候使用 task 语句测试每日调度了。 我创建了这个任务:

CREATE TASK schedule_regioni
  WAREHOUSE = COMPUTE_WH
  SCHEDULE = 'USING CRON 42 18 9 9 * Europe/Rome'
  COMMENT = 'Test Schedule'
AS
  copy into DEMO_DB.PUBLIC.DATA_BY_REGION from @sg_gcs_covid pattern='.*data_by_region.*';

我启用了它:

alter task schedule_regioni resume;

我没有收到任何错误,但任务没有加载数据。 为了解决这个问题,我必须将 copy 放在存储过程中,并插入存储过程的调用而不是副本:

DROP TASK schedule_regioni;
CREATE TASK schedule_regioni
  WAREHOUSE = COMPUTE_WH
  SCHEDULE = 'USING CRON 42 18 9 9 * Europe/Rome'
  COMMENT = 'Test Schedule'
AS
  call sp_upload_c19_regioni();

问题是:这是一种期望的行为还是一个问题(如我所料)?

谁能给我一些这方面的信息?

【问题讨论】:

您不需要 SP。我认为您在某处有权限问题。直接用COPY INTO而不是SP执行任务时,你有输出吗? 【参考方案1】:

我刚刚尝试过(但在 AWS S3 上使用了存储集成和阶段),并且在任务的 sql 部分中使用复制命令也可以正常工作,而无需调用存储过程。 为了开始调查这个问题,我会检查以下信息(也许为了调试,我会创建每隔几分钟安排一次的任务):

    检查task_history并验证执行情况

    select *
       from table(information_schema.task_history(
       scheduled_time_range_start=>dateadd('hour',-1,current_timestamp()),
       result_limit => 100,
       task_name=>'YOUR_TASK_NAME'));
    

    如果上一步成功,检查copy_history并验证输入文件名、目标表和记录/错误数是否符合预期

    SELECT *
    FROM TABLE (information_schema.copy_history(TABLE_NAME => 'YOUR_TABLE_NAME',
                start_time=> dateadd(hours, -1, current_timestamp())))
    ORDER BY 3 DESC;
    

检查执行sp调用任务时得到的结果是否相同。

还请确认您正在使用 COPY 命令加载尚未加载到表中的新文件(否则您需要在复制命令中指定 FORCE = TRUE 参数或删除截断目标表的元数据信息以重新加载相同的文件)。

【讨论】:

嗨,我理解我的错,我改变了任务但我没有恢复它!感谢您的支持。

以上是关于如何在雪花任务语句中使用复制存储集成?的主要内容,如果未能解决你的问题,请参考以下文章

如何评估雪花存储过程中的语句

雪花存储过程 - 如何检索 CTAS 语句创建的行数

如何获取雪花中执行存储过程的名称?

如何将存储在雪花中的所有视图下载到本地机器

带有输入变量的雪花存储过程

如何在雪花日期数据类型字段中插入儒略日期