Chuck
Chuck

Reputation: 1293

where is the option to load CSV into Snowflake? I'm not seeing it

I'm testing out a trial version of Snowflake. I created a table and want to load a local CSV called "food" but I don't see any "load" data option as shown in tutorial videos.

What am I missing? Do I need to use a PUT command somewhere?

enter image description here

Upvotes: 0

Views: 2316

Answers (2)

Martin
Martin

Reputation: 11

If the classic UI is limiting you or you are already using Snowsight and don't want to switch back, then here is another way to upload a CSV file.

A preliminary is that you have installed SnowSQL on your device (https://docs.snowflake.com/en/user-guide/snowsql-install-config.html). Start SnowSQL and perform the following steps:

  1. Use the database where to upload the file to. You need various privileges for creating a stage, a fileformat, and a table. E.g. USE MY_TEST_DB;

  2. Create the fileformat you want to use for uploading your CSV file. E.g.

CREATE FILE FORMAT "MY_TEST_DB"."PUBLIC".MY_FILE_FORMAT TYPE = 'CSV';

If you don't configure the RECORD_DELIMITER, the FIELD_DELIMITER, and other stuff, Snowflake uses some defaults. I suggest you have a look at https://docs.snowflake.com/en/sql-reference/sql/create-file-format.html. Some of the auto detection stuff can make your life hard and sometimes it is better to disable it.

  1. Create a stage using the previously created fileformat

CREATE STAGE MY_STAGE file_format = "MY_TEST_DB"."PUBLIC".MY_FILE_FORMAT;

  1. Now you can put your file to this stage

PUT file://<file_path>/file.csv @MY_STAGE;

You can find documentation for configuring the stage at https://docs.snowflake.com/en/sql-reference/sql/create-stage.html

  1. You can check the upload with

SELECT d.$1, ..., d.$N FROM @MY_STAGE/file.csv d;

  1. Then, create your table.

CREATE TABLE MY_TABLE (col1 varchar, ..., colN varchar);

Personally, I prefer creating first a table with only varchar columns and then create a view or a table with the final types. I love the try_to_* functions in snowflake (e.g. https://docs.snowflake.com/en/sql-reference/functions/try_to_decimal.html).

  1. Then, copy the content from your stage to your table. If you want to transform your data at this point, you have to use an inner select. If not then the following command is enough.

COPY INTO mycsvtable from @MY_STAGE/file.csv;

I suggest doing this without the inner SELECT because then the option ERROR_ON_COLUMN_COUNT_MISMATCH works.

Be aware that the schema of the table must match the format. As mentioned above, if you go with all columns as varchars first and then transform the columns of interest in a second step, you should be fine.

You can find documentation for copying the staged file into a table at https://docs.snowflake.com/en/sql-reference/sql/copy-into-table.html

  1. If you can check the dropped lines as follows:

SELECT error, line, character, rejected_record FROM table(validate("MY_TEST_DB"."MY_SCHEMA"."MY_CSV_TABLE", job_id=>'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'))

Details can be found at https://docs.snowflake.com/en/sql-reference/functions/validate.html.

If you want to add those lines to your success table you can copy the the dropped lines to a new table and transform the data until the schema matches with the schema of the success table. Then, you can UNION both tables.

You see that it is pretty much to do for loading a simple CSV file to Snowflake. It becomes even more complicated when you take into account that every step can cause some specific failures and that your file might contain erroneous lines. This is why my team and I are working at Datameer to make these types of tasks easier. We aim for a simple drag and drop solution that does most of the work for you. We would be happy if you would try it out here: https://www.datameer.com/upload-csv-to-snowflake/

Upvotes: 1

Dean Flinter
Dean Flinter

Reputation: 674

Don't think Snowsight has that option in the UI. It's available in the classic UI though. Go to Databases tab, select a database. Go to Tables tab and select a table the option will be at the top

enter image description here

Upvotes: 2

Related Questions