Выражение COPY
Примеры
Считывание файла CSV в таблицу lineitem, используя автоматически определенные параметры CSV:
COPY lineitem FROM 'lineitem.csv';
Считывание файла CSV в таблицу lineitem, используя вручную заданные параметры CSV:
COPY lineitem FROM 'lineitem.csv' (DELIMITER '|');
Считывание файла Parquet в таблицу lineitem:
COPY lineitem FROM 'lineitem.pq' (FORMAT PARQUET);
Считывание файла JSON в таблицу lineitem, используя автоматически определенные параметры:
COPY lineitem FROM 'lineitem.json' (FORMAT JSON, AUTO_DETECT true);
Считывание файла CSV в таблицу lineitem, используя двойные кавычки:
COPY lineitem FROM "lineitem.csv";
Считывание файла CSV в таблицу lineitem, опуская кавычки:
COPY lineitem FROM lineitem.csv;
Запись таблицы в файл CSV:
COPY lineitem TO 'lineitem.csv' (FORMAT CSV, DELIMITER '|', HEADER);
Запись таблицы в файл CSV, используя двойные кавычки:
COPY lineitem TO "lineitem.csv";
Запись таблицы в файл CSV, опуская кавычки:
COPY lineitem TO lineitem.csv;
Запись результата запроса в файл Parquet:
COPY (SELECT l_orderkey, l_partkey FROM lineitem) TO 'lineitem.parquet' (COMPRESSION ZSTD);
Копирование всего содержимого базы данных db1 в базу данных db2:
COPY FROM DATABASE db1 TO db2;
Копирование только схемы (элементов каталога), но не данных:
COPY FROM DATABASE db1 TO db2 (SCHEMA);
Обзор
COPY перемещает данные между DuckDB и внешними файлами. COPY ... FROM импортирует данные в DuckDB из внешнего файла. COPY ... TO записывает данные из DuckDB во внешние файлы. Команда COPY может использоваться для CSV, PARQUET и JSON файлов.
COPY ... FROM
COPY ... FROM импортирует данные из внешнего файла в существующую таблицу. Данные добавляются к данным, которые уже находятся в таблице. Количество столбцов в файле должно совпадать с количеством столбцов в таблице table_name, и содержимое столбцов должно быть конвертируемо в типы столбцов таблицы. В случае, если это невозможно, будет выброшено исключение.
Если указан список столбцов, COPY скопирует только данные указанных столбцов из файла. Если в таблице есть столбцы, которые не входят в список столбцов, COPY ... FROM вставит значения по умолчанию для этих столбцов.
Копирование содержимого файла с разделителем запятая test.csv без заголовка в таблицу test:
COPY test FROM 'test.csv';
Копирование содержимого файла с разделителем запятая с заголовком в таблицу category:
COPY category FROM 'categories.csv' (HEADER);
Копирование содержимого lineitem.tbl в таблицу lineitem, где данные разделяются символом «|» (|):
COPY lineitem FROM 'lineitem.tbl' (DELIMITER '|');
Копирование содержимого lineitem.tbl в таблицу lineitem, где разделитель, символ кавычек и наличие заголовка автоматически определяются:
COPY lineitem FROM 'lineitem.tbl' (AUTO_DETECT true);
Чтение содержимого файла с разделителем запятая names.csv в столбец name таблицы category. Любые другие столбцы этой таблицы заполняются значением по умолчанию:
COPY category(name) FROM 'names.csv';
Чтение содержимого файла Parquet lineitem.parquet в таблицу lineitem:
COPY lineitem FROM 'lineitem.parquet' (FORMAT PARQUET);
Чтение содержимого файла JSON с разделителем перенос строки lineitem.ndjson в таблицу lineitem:
COPY lineitem FROM 'lineitem.ndjson' (FORMAT JSON);
Чтение содержимого файла JSON lineitem.json в таблицу lineitem:
COPY lineitem FROM 'lineitem.json' (FORMAT JSON, ARRAY true);
Синтаксис
COPY ... TO
COPY ... TO экспортирует данные из DuckDB во внешние файлы CSV или Parquet. Она имеет практически тот же набор опций, что и COPY ... FROM, однако в случае COPY ... TO опции задают, как файл должен быть записан на диск. Любой файл, созданный COPY ... TO, может быть скопирован обратно в базу данных с использованием COPY ... FROM с похожим набором опций.
Функция COPY ... TO может быть вызвана, указав имя таблицы или запрос. Когда указывается имя таблицы, содержимое всей таблицы будет записано в результирующий файл. Когда указывается запрос, запрос выполняется, и результат запроса записывается в результирующий файл.
Копирование содержимого таблицы lineitem в файл CSV с заголовком:
COPY lineitem TO 'lineitem.csv';
Копирование содержимого таблицы lineitem в файл lineitem.tbl, где столбцы разделены символом «|» (|), включая строку заголовка:
COPY lineitem TO 'lineitem.tbl' (DELIMITER '|');
Использование табуляции для создания TSV-файла без заголовка:
COPY lineitem TO 'lineitem.tsv' (DELIMITER '\t', HEADER false);
Копирование столбца l_orderkey таблицы lineitem в файл orderkey.tbl:
COPY lineitem(l_orderkey) TO 'orderkey.tbl' (DELIMITER '|');
Копирование результата запроса в файл query.csv, включая заголовок с именами столбцов:
COPY (SELECT 42 AS a, 'hello' AS b) TO 'query.csv' (DELIMITER ',');
Копирование результата запроса в файл Parquet query.parquet:
COPY (SELECT 42 AS a, 'hello' AS b) TO 'query.parquet' (FORMAT PARQUET);
Копирование результата запроса в файл JSON с разделителем перенос строки query.ndjson:
COPY (SELECT 42 AS a, 'hello' AS b) TO 'query.ndjson' (FORMAT JSON);
Копирование результата запроса в файл JSON query.json:
COPY (SELECT 42 AS a, 'hello' AS b) TO 'query.json' (FORMAT JSON, ARRAY true);
COPY ... TO Опции
Ноль или более опций копирования могут быть предоставлены в рамках операции копирования. Спецификатор WITH является необязательным, но если опции указаны, скобки обязательны. Значения параметров могут передаваться с или без обертки в одинарные кавычки.
Любая опция, являющаяся булевым значением, может быть включена или отключена несколькими способами. Можно написать true, ON, или 1 для включения опции и false, OFF, или 0 для её отключения. Значение BOOLEAN также может быть опущено, например, пропустив только (HEADER), в этом случае предполагается true.
Ниже приведенные опции применимы ко всем форматам, записанным с COPY.
| Имя | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
FORMAT | Указывает функцию копирования для использования. По умолчанию выбирается из расширения файла (например, .parquet приводит к записи/чтению файла Parquet). Если расширение файла неизвестно CSV выбирается по умолчанию. Vanilla DuckDB предоставляет CSV, PARQUET и JSON, но дополнительные функции копирования можно добавить, используя extensions. | VARCHAR | auto |
USE_TMP_FILE | Флаг, указывающий, следует ли сначала записать данные в временный файл, если исходный файл существует (target.csv.tmp). Это предотвращает перезапись существующего файла поврежденным файлом в случае отмены записи. | BOOL | auto |
OVERWRITE_OR_IGNORE | Флаг, указывающий, разрешено ли перезаписывать файлы, если они уже существуют. Действует только при использовании с partition_by. | BOOL | false |
OVERWRITE | Если установлено, все существующие файлы внутри целевых каталогов будут удалены (не поддерживается на удалённых файловых системах). Действует только при использовании с partition_by. | BOOL | false |
APPEND | Если установлено, в случае генерации имени файла, которое уже существует, путь будет сгенерирован заново, чтобы гарантировать, что существующие файлы не перезапишутся. Действует только при использовании с partition_by. | BOOL | false |
FILENAME_PATTERN | Установите шаблон для использования в имени файла, который может необязательно содержать {uuid} для заполнения сгенерированным UUID или {id}, который заменяется инкрементным индексом. Действует только при использовании с partition_by. | VARCHAR | auto |
FILE_EXTENSION | Установите расширение файла, которое должно быть назначено сгенерированному файлу(ам). | VARCHAR | auto |
PER_THREAD_OUTPUT | Создавать по одному файлу на поток, а не один файл в целом. Это позволяет ускорить параллельную запись. | BOOL | false |
FILE_SIZE_BYTES | Если этот параметр установлен, процесс COPY создаёт каталог, который будет содержать экспортированные файлы. Если размер файла превышает заданный лимит (указанный в байтах, например 1000 или в читаемом формате, например 1k), процесс создаёт новый файл в каталоге. Этот параметр работает в сочетании с PER_THREAD_OUTPUT. Обратите внимание, что размер используется приблизительно, и файлы иногда могут быть немного больше лимита. |
VARCHAR или BIGINT
| (пусто) |
PARTITION_BY | Столбцы для разбиения с использованием схемы разбиения Hive, см. раздел разбиения таблиц. | VARCHAR[] | (пусто) |
RETURN_FILES | Включать ли созданный(ые) путь(и) к файлу (как столбец Files VARCHAR[]) в результат запроса. | BOOL | false |
WRITE_PARTITION_COLUMNS | Следует ли записывать столбцы разбиения в файлы. Действует только при использовании с partition_by. | BOOL | false |
Синтаксис
COPY FROM DATABASE ... TO
Оператор COPY FROM DATABASE ... TO копирует всё содержимое одной подключенной базы данных в другую подключенную базу данных. Это включает схему, включая ограничения, индексы, последовательности, макросы и сами данные.
ATTACH 'db1.db' AS db1; CREATE TABLE db1.tbl AS SELECT 42 AS x, 3 AS y; CREATE MACRO db1.two_x_plus_y(x, y) AS 2 * x + y; ATTACH 'db2.db' AS db2; COPY FROM DATABASE db1 TO db2; SELECT db2.two_x_plus_y(x, y) AS z FROM db2.tbl;
| z |
|---|
| 87 |
Чтобы скопировать только схему db1 в db2, но не копировать данные, добавьте SCHEMA к оператору:
COPY FROM DATABASE db1 TO db2 (SCHEMA);
Синтаксис
Формат-специфичные опции
Опции CSV
Нижеприведённые параметры применимы при записи CSV файлов.
| Имя | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
COMPRESSION | Тип сжатия для файла. По умолчанию это будет определяться автоматически из расширения файла (например, file.csv.gz будет использовать gzip, file.csv будет использовать none). Доступные варианты: none, gzip, zstd. | VARCHAR | auto |
DATEFORMAT | Указывает формат даты для записи дат. См. Формат даты | VARCHAR | (пусто) |
DELIM или SEP
| Символ, используемый для разделения столбцов в каждой строке. | VARCHAR | , |
ESCAPE | Символ, который должен появляться перед символом, соответствующим значению quote . | VARCHAR | " |
FORCE_QUOTE | Список столбцов, к которым всегда должны добавляться кавычки, даже если это не требуется. | VARCHAR[] | [] |
HEADER | Следует ли записывать заголовок для CSV файла. | BOOL | true |
NULLSTR | Строка, которая записывается для представления значения NULL. | VARCHAR | (пусто) |
QUOTE | Символ кавычек, который используется, когда значение данных заключено в кавычки. | VARCHAR | " |
TIMESTAMPFORMAT | Указывает формат даты для записи временных меток. См. Формат даты | VARCHAR | (пусто) |
Опции Parquet
Нижеприведённые параметры применимы при записи файлов Parquet.
| Имя | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
COMPRESSION | Формат сжатия (uncompressed, snappy, gzip или zstd). | VARCHAR | snappy |
COMPRESSION_LEVEL | Уровень сжатия, значение от 1 (низкое сжатие, высокая скорость) до 22 (высокое сжатие, низкая скорость). Поддерживается только для сжатия zstd. | BIGINT | 3 |
FIELD_IDS | Размер field_id для каждого столбца. Для автоматического определения используйте auto. | STRUCT | (пусто) |
ROW_GROUP_SIZE_BYTES | Целевой размер каждой группы строк. Можно использовать строку в удобочитаемом формате, например, 2MB, или целое число, то есть количество байтов. Этот параметр используется только при использовании SET preserve_insertion_order = false;, в противном случае игнорируется. | BIGINT | row_group_size * 1024 |
ROW_GROUP_SIZE | Целевой размер (количество строк) каждой группы строк. | BIGINT | 122880 |
ROW_GROUPS_PER_FILE | Создать новый файл Parquet, если в текущем файле указанное количество групп строк. Если активны несколько потоков, количество групп строк в файле может немного превышать заданное количество групп строк, чтобы ограничить количество блокировок – аналогично поведению FILE_SIZE_BYTES. Однако, если per_thread_output установлен, только один поток записывает в каждый файл, и это становится точным снова. | BIGINT | (пусто) |
Примеры FIELD_IDS:
Автоматическое назначение field_ids:
COPY
(SELECT 128 AS i)
TO 'my.parquet'
(FIELD_IDS 'auto'); Устанавливает field_id столбца i в значение 42:
COPY
(SELECT 128 AS i)
TO 'my.parquet'
(FIELD_IDS {i: 42}); Устанавливает field_id столбца i в значение 42, и столбца j в значение 43:
COPY
(SELECT 128 AS i, 256 AS j)
TO 'my.parquet'
(FIELD_IDS {i: 42, j: 43}); Устанавливает field_id столбца my_struct в значение 43, и столбца i (вложенного в my_struct ) в значение 43:
COPY
(SELECT {i: 128} AS my_struct)
TO 'my.parquet'
(FIELD_IDS {my_struct: {__duckdb_field_id: 42, i: 43}}); Устанавливает field_id столбца my_list в значение 42, и столбца element (имя дочернего элемента списка по умолчанию) в значение 43:
COPY
(SELECT [128, 256] AS my_list)
TO 'my.parquet'
(FIELD_IDS {my_list: {__duckdb_field_id: 42, element: 43}}); Устанавливает field_id столбца my_map в значение 42, и столбцов key и value (имена дочерних элементов словаря по умолчанию) в значения 43 и 44:
COPY
(SELECT MAP {'key1' : 128, 'key2': 256} my_map)
TO 'my.parquet'
(FIELD_IDS {my_map: {__duckdb_field_id: 42, key: 43, value: 44}}); Параметры JSON
Ниже приведенные параметры применимы при записи файлов JSON.
| Имя | Описание | Тип | Значение по умолчанию |
|---|---|---|---|
ARRAY | Запись массива JSON. Если true, записывается массив JSON из записей, если false, записывается JSON, разделенный символом новой строки. | BOOL | false |
COMPRESSION | Тип сжатия для файла. По умолчанию он определяется автоматически из расширения файла (например, file.json.gz будет использовать gzip, file.json будет использовать none). Доступные варианты: none, gzip, zstd. | VARCHAR | auto |
DATEFORMAT | Указывает формат даты для записи дат. См. Формат даты | VARCHAR | (пусто) |
TIMESTAMPFORMAT | Указывает формат даты для записи временных меток. См. Формат даты | VARCHAR | (пусто) |
Ограничения
COPY не поддерживает копирование между таблицами. Для копирования между таблицами используйте INSERT statement:
INSERT INTO tbl2
FROM tbl1;
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/statements/copy.html