在教程“教程:使用副本从本地文件系统批量加载”中,my_stage 和 my_table 权限有啥区别?

Posted

技术标签:

【中文标题】在教程“教程:使用副本从本地文件系统批量加载”中,my_stage 和 my_table 权限有啥区别?【英文标题】:In the tutorial "Tutorial: Bulk Loading from a local file system using copy" what is the difference between my_stage and my_table permissions?在教程“教程:使用副本从本地文件系统批量加载”中,my_stage 和 my_table 权限有什么区别? 【发布时间】:2019-12-20 19:47:31 【问题描述】:

我开始阅读第一个教程,了解如何将数据从本地文件加载到 Snowflake。

这是我目前设置的:

CREATE WAREHOUSE mywh;
CREATE DATABASE Mydb; 
Use Database mydb;


CREATE ROLE ANALYST;

grant usage on database mydb to role sysadmin;
grant usage on database mydb to role analyst;


grant usage, create file format, create stage, create table on schema mydb.public to role analyst;

grant operate, usage on warehouse mywh to role analyst;

//tutorial 1 loading data
CREATE FILE FORMAT mycsvformat
   TYPE = "CSV"
   FIELD_DELIMITER= ','
   SKIP_HEADER = 1;

CREATE FILE FORMAT myjsonformat
   TYPE="JSON"
   STRIP_OUTER_ARRAY = true; 
   
//create stage
CREATE OR REPLACE STAGE my_stage
   FILE_FORMAT = mycsvformat;
   
//Use snowsql for this and make sure that the role, db, and warehouse are seelcted: put file:///data/data.csv @my_stage;
  
   
 // put file on stage
 PUT file://contacts.csv @my
 
 List @~;
 
 list @%mytable;
   

然后在我运行时在我的活动 Snowsql 中:

Put file:///Users/<user>/Documents/data/data.csv @my_table;

我已确认我的帐户管理员角色正确: 002003 (02000):SQL 编译错误: 阶段“MYDB.PUBLIC.MY_TABLE”不存在或未授权。

然后我尝试在 Snowsql 中创建表并成功:

create or replace table my_table(id varchar, link varchar, stuff string);

我运行后仍然遇到这个错误:

Put file:///Users/<>/Documents/data/data.csv @my_table;

002003 (02000):SQL 编译错误: 阶段“MYDB.PUBLIC.MY_TABLE”不存在或未授权。

在这种情况下,将文件放入 my_table 和 my_stage 有什么区别?感谢您的帮助!

编辑:

CREATE OR REPLACE TABLE myjsontable(json variant);
 
COPY INTO myjsontable
  FROM @my_stage/random.json.gz
  FILE_FORMAT = (TYPE= 'JSON')
  ON_ERROR = 'skip_file';
 
 CREATE OR REPLACE TABLE save_copy_errors AS SELECT * FROM TABLE(VALIDATE(myjsontable, JOB_ID=>'enterid'));
 SELECT * FROM SAVE_COPY_ERRORS;
 //error for random: Error parsing JSON: invalid character outside of a string: '\\'
 //no error for generated
 
 SELECT * FROM Myjsontable;
 
REMOVE @My_stage pattern = '.*.csv.gz';


REMOVE @My_stage pattern = '.*.json.gz';

//yay your are done!

【问题讨论】:

【参考方案1】:

put 命令将文件从本地驱动器复制到舞台。你应该把它放到舞台上,而不是那张桌子上。

put file:///Users/<>/Documents/data/data.csv @my_stage;

复制命令从舞台加载它。

【讨论】:

知道了,谢谢,我在问题中添加了额外的步骤。【参考方案2】:

但是在文档中提到它就像是默认为每个阶段创建的一样

默认情况下,每个表都分配有一个 Snowflake 阶段用于存储文件。如果您的文件需要可供多个用户访问并且只需要复制到单个表中,则此阶段是一个方便的选项。

表格阶段具有以下特点和局限性:

表阶段与表同名;例如名为 mytable 的表有一个引用为 @%mytable

的阶段

在这种情况下,如果不创建阶段,它应该加载到分配的默认雪花阶段

【讨论】:

以上是关于在教程“教程:使用副本从本地文件系统批量加载”中,my_stage 和 my_table 权限有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Go 使用 GraphQL - 基础教程

VeeValidate 教程

在 Hartl 的教程中添加联系表单

08《Vue 入门教程》Vue 事件处理

Pr 入门教程,了解基本校正选项

在 DjangoGirls 教程中无法部署到 Heroku