在教程“教程:使用副本从本地文件系统批量加载”中,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 权限有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章