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

时间:2019-12-20 19:47:31

标签: snowflake-data-warehouse

我开始阅读第一个教程,了解如何从本地文件将数据加载到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;

我已确认我担任Accountadmin的正确角色: 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!

2 个答案:

答案 0 :(得分:1)

put命令将文件从本地驱动器复制到舞台。您应该在舞台上进行摆放,而不是在桌子上摆放。

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

copy命令从舞台上加载它。

答案 1 :(得分:0)

但是在文档中,它的提及就像每个阶段都会默认创建一样

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

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

表阶段与表同名;例如名为mytable的表的阶段被称为@%mytable

在这种情况下,如果不创建阶段,则应将其加载到已分配的默认雪花阶段中