COPY FROM
Imports data from a comma-separated values (CSV) file or a delimited text file into an existing table. Each line in the source file is imported as a row. All rows in the dataset must contain the same number of fields and have values in the PRIMARY KEY fields.
The process verifies the PRIMARY KEY and updates existing records.
If HEADER = false and no column names are specified, the fields are imported in deterministic order.
When HEADER = true, the first row of a file is a header row.
|
Only use |
Synopsis
COPY <table_name> [ ( <column_list> ) ]
FROM '<file_name>'[ , '<file2_name>', ... ] | STDIN
[ WITH option = 'value' [ AND ... ] ]
|
|
| Syntax conventions | Description |
|---|---|
UPPERCASE |
Literal keyword. |
Lowercase |
Not literal. |
|
Variable value. Replace with a user-defined value. |
|
Optional.
Square brackets ( |
|
Group.
Parentheses ( |
|
Or.
A vertical bar ( |
|
Repeatable.
An ellipsis ( |
|
Single quotation ( |
|
Map collection.
Braces ( |
|
Set, list, map, or tuple.
Angle brackets ( |
|
End CQL statement.
A semicolon ( |
|
Separate the command line options from the command arguments with two hyphens ( |
|
Search CQL only: Single quotation marks ( |
|
Search CQL only: Identify the entity and literal value to overwrite the XML element in the schema and solrConfig files. |
- <table_name>
-
Table for the copy operation.
- <column_list>
-
List of columns in the table. All fields are included when no column names are specified. To omit columns, specify a column list with only the columns to include.
- <file_name>, <file2_name>
-
CSV file name.
Set COPY options
You can set COPY options on the command line or in a cqlshrc file.
If you use the same settings frequently, the cqlshrc file can be more convenient that specifying them on the command line each time.
The cqlshrc file is also recommended for storing connection options, like credentials.
Options set on the command line override options set in cqlshrc, and options set in cqlshrc override the default settings.
Because the COPY command has subcommands for COPY TO and COPY FROM, some options apply to the COPY command generally, some options apply to a specific subcommand only, and some options are available to both subcommands but specific in a subcommand section in cqlshrc.
The following example shows options in the [copy] section of the cqlshrc file.
For subcommand-specific options, use [copy-to] or [copy-from] sections.
[copy]
BOOLSTYLE = True,False
CONFIGFILE = /home/
DATETIMEFORMAT = %m/%d/%Y
DECIMALSEP = ,
DELIMITER = |
ESCAPE = `
HEADER = true
MAXATTEMPTS = 10
NULL = NULL
NUMPROCESSES = -1
QUOTE = "
REPORTFREQUENCY = 1
RATEFILE = /home/copyrate.log
SKIPCOLS = firstname
SKIPROWS = 6
THOUSANDSSEP = ,
| Option | Description | Default | Supported subcommand | cqlshrc section |
|---|---|---|---|---|
|
Boolean indicators for true and false.
The values are case-insensitive.
For example: |
|
|
|
|
Directory that contains the |
|
|
|
|
Time format for reading or writing CSV time data. The timestamp uses the strftime format. |
|
|
|
|
Decimal value separator. |
|
|
|
|
Field separator. |
|
|
|
|
Single character that escapes literal uses of the QUOTE character. |
|
|
|
|
Whether to treat the first row of a CSV file as a header row.
|
|
|
|
|
Maximum number of attempts for errors. |
|
|
|
|
Value automatically written if a field is empty. |
|
|
|
|
Number of worker processes. Maximum value is 16. |
|
|
|
|
Encloses field values. |
|
|
|
|
Frequency with which status is displayed in seconds. |
|
|
|
|
Print output statistics to this file. |
|
|
|
|
Names of columns to skip. |
|
|
|
|
Number of rows to skip, starting from the first row of data. |
|
|
|
|
Separator for thousands digit groups. |
|
|
|
|
Minimum token string for exporting data. |
|
|
|
|
Number of digits to display after the decimal point for CQL double precision values. |
|
|
|
|
Output string type. |
|
|
|
|
Maximum token string for exporting data. |
|
|
|
|
File to store all rows that are not imported. |
A file named |
|
|
|
Number of digits to display after the decimal point for CQL float (single precision) values. |
|
|
|
|
Maximum size of the output file, measured in number of lines.
When set, the output file is split into segment when the value is exceeded.
Use |
|
|
|
|
Maximum number of requests each worker can process in parallel. |
|
|
|
|
Page size for fetching results. |
|
|
|
|
Page timeout for fetching results. |
|
|
|
|
Time to live in seconds. By default, data will not expire. |
|
|
|
|
Chunk size passed to worker processes. |
|
|
|
|
Approximate ingest rate in rows per second. Must be greater than the chunk size. |
|
|
|
|
Maximum size of an import batch. |
|
|
|
|
Maximum global number of insert errors.
Use |
|
|
|
|
Maximum global number of parsing errors.
Use |
|
|
|
|
Maximum number of rows.
Use |
|
|
|
|
Minimum size of an import batch. |
|
|
|
Set table-specific COPY options
On the command line, you specify the keyspace and table name is your command, so all options are applied to a specific table.
For tables that are frequently targeted by COPY commands, you can set table-specific options in the cqlshrc file.
Create separate sections for each table using the appropriate section naming convention.
chunksize-
Chunk size passed to worker processes for both the
COPY TOandCOPY FROMsubcommands.-
Section:
[copy:<keyspace_name.table_name>] -
Default:
1000
[copy:cycling.rank_by_year_and_name] chunksize = 10000 -
ingestrate-
Approximate ingest rate in rows per second for the
COPY FROMsubcommand. Must be greater thanchunksize.-
Section:
[copy-from:<keyspace_name.table_name>] -
Default:
100000
[copy-from:cycling.rank_by_year_and_name] ingestrate = 80000 -
pagetimeout-
Page timeout when fetching results for the
COPY TOsubcommand.-
Section:
[copy-to:<keyspace_name.table_name>] -
Default:
10
[copy-to:cycling.rank_by_year_and_name] pagetimeout = 10 -
Examples
These examples use the following schema and data:
-
Create a
cyclingkeyspace:CREATE KEYSPACE cycling WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 }; -
Create the
cycling.cyclist_nametable:CREATE TABLE cycling.cyclist_name ( id UUID PRIMARY KEY, lastname text, firstname text ); -
Insert data into
cycling.cyclist_name:INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (5b6962dd-3f90-4c93-8f61-eabfa4a803e2, 'VOS','Marianne'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (e7cd5752-bc0d-4157-a80f-7523add8dbcd, 'VAN DER BREGGEN','Anna'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (e7ae5cf3-d358-4d99-b900-85902fda9bb0, 'FRAME','Alex'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (220844bf-4860-49d6-9a4b-6b5d3a79cbfb, 'TIRALONGO','Paolo'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47, 'KRUIKSWIJK','Steven'); INSERT INTO cycling.cyclist_name (id, lastname, firstname) VALUES (fb372533-eb95-4bb4-8685-6ef61e994caa, 'MATTHEWS', 'Michael');
Export and import data from a table
-
Export only the
idandlastnamecolumns from thecyclist_nametable to a CSV file:COPY cycling.cyclist_name (id,lastname) TO '../cyclist_lastname.csv' WITH HEADER = TRUE;The cyclist_lastname.csv file is created in the directory above the current working directory (indicated by ../). If the CSV file already exists, it is overwritten. If you do not have permission to create the file in the directory, you can use a different directory; for example, to use the current working directory, omit the directory path before the file name.
Using 7 child processes Starting copy of cycling.cyclist_name with columns [id, lastname]. Processed: 6 rows; Rate: 29 rows/s; Avg. rate: 29 rows/s 6 rows exported to 1 files in 0.223 seconds. -
Copy the
idandfirstnameto a different CSV file named cyclist_firstname.csv:COPY cycling.cyclist_name (id,firstname) TO '../cyclist_firstname.csv' WITH HEADER = TRUE;The CSV file is created:
Using 7 child processes Starting copy of cycling.cyclist_name with columns [id, firstname]. Processed: 6 rows; Rate: 30 rows/s; Avg. rate: 30 rows/s 6 rows exported to 1 files in 0.213 seconds. -
Remove all records from the cyclist name table:
TRUNCATE cycling.cyclist_name; -
Verify that there are no rows:
SELECT * FROM cycling.cyclist_name;Query results are empty:
id | firstname | lastname ----+-----------+---------- (0 rows) -
Import the cyclist first names:
COPY cycling.cyclist_name (id,firstname) FROM '../cyclist_firstname.csv' WITH HEADER = TRUE;The rows are imported:
Using 7 child processes Starting copy of cycling.cyclist_name with columns [id, firstname]. Processed: 6 rows; Rate: 10 rows/s; Avg. rate: 14 rows/s 6 rows imported from 1 files in 0.423 seconds (0 skipped). -
Verify the new rows:
SELECT * FROM cycling.cyclist_name;The rows were created with null last names because the
lastnamefield was not in the imported dataset:id | firstname | lastname --------------------------------------+-----------+---------- e7ae5cf3-d358-4d99-b900-85902fda9bb0 | Alex | null fb372533-eb95-4bb4-8685-6ef61e994caa | Michael | null 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | Marianne | null 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | Paolo | null 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | Steven | null e7cd5752-bc0d-4157-a80f-7523add8dbcd | Anna | null (6 rows) -
Import the last names:
COPY cycling.cyclist_name (id,lastname) FROM '../cyclist_lastname.csv' WITH HEADER = TRUE;The records are imported but no new records are created:
Using 7 child processes Starting copy of cycling.cyclist_name with columns [id, lastname]. Processed: 6 rows; Rate: 10 rows/s; Avg. rate: 14 rows/s 6 rows imported from 1 files in 0.422 seconds (0 skipped). -
Verify the that the records were updated:
SELECT * FROM cycling.cyclist_name;The PRIMARY KEY
idmatched for all records and thelastnameis populated.:id | firstname | lastname --------------------------------------+-----------+----------------- e7ae5cf3-d358-4d99-b900-85902fda9bb0 | Alex | FRAME fb372533-eb95-4bb4-8685-6ef61e994caa | Michael | MATTHEWS 5b6962dd-3f90-4c93-8f61-eabfa4a803e2 | Marianne | VOS 220844bf-4860-49d6-9a4b-6b5d3a79cbfb | Paolo | TIRALONGO 6ab09bec-e68e-48d9-a5f8-97e6fb4c9b47 | Steven | KRUIKSWIJK e7cd5752-bc0d-4157-a80f-7523add8dbcd | Anna | VAN DER BREGGEN
Copy data from standard input to a table
-
Clear the data from the
cyclist_nametable:TRUNCATE cycling.cyclist_name; -
Start the copy input operation using the
FROM STDINoption:COPY cycling.cyclist_name FROM STDIN;The line prompt changes to
[copy]:Using 7 child processes Starting copy of cycling.cyclist_name with columns [id, firstname, lastname]. [Use . on a line by itself to end input] [copy] -
Next to the
[copy]prompt, enter the field values in a common-separated list; on the last line of data, enter a period:[copy] e7cd5752-bc0d-4157-a80f-7523add8dbcd,Anna,VAN DER BREGGEN[copy] . -
Press Enter after the period:
Processed: 1 rows; Rate: 0 rows/s; Avg. rate: 0 rows/s 1 rows imported from 1 files in 36.991 seconds (0 skipped). -
Run this query to view the contents of the
cyclist_nametable:SELECT * FROM cycling.cyclist_name;id | firstname | lastname --------------------------------------+-----------+----------------- e7cd5752-bc0d-4157-a80f-7523add8dbcd | Anna | VAN DER BREGGEN (1 rows)
Copy to and from a table with a vector data type
To copy data from a table with a vector data type to a CSV file, use the following command:
COPY cycling.comments_vs (record_id,id,commenter,comment,created_at,comment_vector)
TO '../CSV/comments-vs-new.csv' WITH HEADER=TRUE;
To copy data from a CSV file to a table with a vector data type, use the following command:
COPY cycling.comments_vs (record_id,id,commenter,comment,created_at,comment_vector)
FROM '../CSV/comments-vs.csv' WITH HEADER=TRUE AND DELIMITER='|';