Импорт данных из файла в существующую таблицу

С помощью подкоманды import file вы можете импортировать данные из CSV- или TSV-файлов в существующую таблицу.

Импорт выполняется методом BulkUpsert, который обеспечивает высокоэффективную пакетную вставку большого количества строк без гарантий атомарности. Запись данных разбивается на несколько независимых транзакций, каждая их которых затрагивает единственную партицию, с параллельным исполнением. В случае успеха гарантируется вставка всех данных.

Если в таблице уже содержатся данные, они будут заменены импортируемыми при совпадении первичного ключа.

Импортируемый файл должен быть в кодировке UTF-8. Обработка переноса строки внутри поля данных не поддерживается.

Общий вид команды:

ydb [connection options] import file csv|json|parquet|tsv [options]

, где [connection options] - опции соединения с БД

Параметры подкоманды

Обязательные параметры

  • -p, --path STRING — путь к таблице в базе данных.
  • --input-file STRING — путь к файлу на локальной файловой системе, данные которого нужно импортировать.

Дополнительные параметры

  • --skip-rows NUM — количество строк от начала файла, которое будет пропущено при импорте. Значение по умолчанию: 0.
  • --header — укажите этот параметр, если первая строка (исключая пропущенные при использовании параметра --skip-rows) содержит имена столбцов данных, которые будут сопоставлены соответствующим столбцам таблицы. Если строка заголовка не указана, данные будут сопоставлены в порядке следования столбцов в схеме таблицы.
  • --delimiter STRING — символ-разделитель столбцов данных. В этом параметре нельзя указать символ табуляции в качестве разделителя. Чтобы импортировать файл с таким разделителем, используйте подкоманду import file tsv. Значение по умолчанию: ,.
  • --null-value STRING — значение, которое будет импортировано как NULL. Значение по умолчанию: "".
  • --batch-bytes VAL — разбивать загружаемый файл на пакеты указанного размера. Если строка не умещается в пакет целиком, она будет отброшена и передана в следующем пакете. При любом значении размера пакет будет состоять минимум из одной строки. Значение по умолчанию: 1 Миб.
  • --max-in-flight VAL — количество одновременно загружаемых пакетов данных. Для ускорения импорта больших файлов можно увеличить значение этого параметра. Значение по умолчанию: 100.

Примеры

В примерах используется профиль db1, о создании которого рассказано в статье Знакомство с YDB CLI раздела "Начало работы".

Перед выполнением примеров создайте таблицу series.

Импортировать файл

Файл содержит данные без дополнительной информации. в качестве разделителя используется символ ,:

1,Айтишники,The IT Crowd is a British sitcom.,13182
2,Silicon Valley,Silicon Valley is an American comedy television series.,16166

Примечание

Столбец release_date таблицы series имеет тип Date, поэтому дата релиза в файле для импорта представлена в виде числа. Чтобы импортировать значения в формате timestamp, используйте для них столбцы таблицы строкового типа, либо импортируйте их во временную таблицу и выполните преобразование к нужному типу.

Чтобы импортировать такой файл, выполните команду:

ydb import file csv -p series --input-file series.csv

В результате будут импортированы следующие данные:

┌──────────────┬───────────┬───────────────────────────────────────────────────────────┬──────────────────┐
| release_date | series_id | series_info                                               | title            |
├──────────────┼───────────┼───────────────────────────────────────────────────────────┼──────────────────┤
| "2006-02-03" | 1         | "The IT Crowd is a British sitcom."                       | "Айтишники"      |
├──────────────┼───────────┼───────────────────────────────────────────────────────────┼──────────────────┤
| "2014-04-06" | 2         | "Silicon Valley is an American comedy television series." | "Silicon Valley" |
└──────────────┴───────────┴───────────────────────────────────────────────────────────┴──────────────────┘

Импортировать файл с разделителем |

Файл содержит данные без дополнительной информации. в качестве разделителя используется символ |:

1|IT Crowd|The IT Crowd is a British sitcom.|13182
2|Silicon Valley|Silicon Valley is an American comedy television series.|16166

Чтобы импортировать такой файл, укажите параметр --delimiter со значением |:

ydb import file csv -p series --input-file series.csv  --delimiter "|"

Пропустить строки и считать заголовки столбцов

Файл содержит дополнительную информацию в первой и второй строке, а также заголовки столбцов в третьей. Порядок данных в строках файла не соответствует порядку столбцов в таблице:

#The file contains data about the series.
#
series_id,title,release_date,series_info
1,Айтишники,13182,The IT Crowd is a British sitcom.
2,Silicon Valley,16166,Silicon Valley is an American comedy television series.

Чтобы пропустить комментарии в первой и второй строке, укажите параметр --skip-rows 2. Чтобы обработать строку третью строку как заголовки и сопоставить данные файла нужным столбцам таблицы, укажите параметр --header:

ydb import file csv -p series --input-file series.csv --skip-rows 2 --header

Заменить значения на NULL

Файл содержит часто используемое для NULL обозначение — \N, а также пустую строку.

1,Айтишники,The IT Crowd is a British sitcom.,13182
2,Silicon Valley,"",\N
3,Lost,,\N

Укажите параметр --null-value "\N", чтобы интерпретировать значение \N как NULL:

ydb import file csv -p series --input-file series.csv --null-value "\N"

В результате будут импортированы следующие данные:

┌──────────────┬───────────┬─────────────────────────────────────┬──────────────────┐
| release_date | series_id | series_info                         | title            |
├──────────────┼───────────┼─────────────────────────────────────┼──────────────────┤
| "2006-02-03" | 1         | "The IT Crowd is a British sitcom." | "Айтишники"      |
├──────────────┼───────────┼─────────────────────────────────────┼──────────────────┤
| null         | 2         | ""                                  | "Silicon Valley" |
├──────────────┼───────────┼─────────────────────────────────────┼──────────────────┤
| null         | 3         | ""                                  | "Lost"           |
└──────────────┴───────────┴─────────────────────────────────────┴──────────────────┘