Как вставить 780k записей Spring Data Postgres - PullRequest
0 голосов
/ 25 июня 2018

CSV-файл будет загружен в корзину Amazon S3.

Текущая реализация:

  1. Чтение CSV-файла с использованием readAll утилиты OpenCSV, которое возвращает List
  2. Сопоставить значение каждого столбца с объектом
  3. Создание объекта списка (текущий размер :: 15000)
  4. Вызов хранилища Spring Data CRUD. SaveAll (Список объектов)
  5. Из 780 тыс. Записей в базе данных сохранилось только 570 тыс. Записей.
  6. Мы не видим никаких исключений / ошибок после вставки этих многочисленных записей.

Абсолютно без понятия, что там происходит после

Немного погуглив, обнаружил, что команда copy в PostgreSQL - это самый быстрый способ чтения / записи в базу данных PostgreSQL.

Это также поддерживается на нескольких языках Java, C, Python.

Попробовал с помощью CopyManager API PostgreSQL, который получил перегруженные версии метода copyIn.

copyIn(String sql, InputStream is) - Мы не можем использовать это, поскольку наш CSV содержит столбцы заголовков в первой строке, и мы хотим пропустить первую строку.

copyIn(String sql, Reader rd) - Это не принимает объект CSVReader, так как он не относится к типу java.io.Reader

Технологии

  • Java 8
  • Spring-Boot 2.0
  • Spring-Data 2.x
  • Spring-JPA 2.x
  • PostgreSQL - 9,6

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Мне удалось выяснить недостатки кода. Мы предоставили один из столбцов db как ограничение Unique, которого не должно быть, тогда как в CSV-файле есть повторяющиеся значения этого столбца. По этой причине вставка записи не удалась.

Спасибо, Phaneendra

0 голосов
/ 14 марта 2019

Мы не можем использовать это, поскольку наш csv содержит столбцы заголовков в первой строке, и мы хотим пропустить первую строку.

Вот для чего COPY ... WITH HEADER.

Указывает, что файл содержит строку заголовка с именами каждого столбца в файле.При выводе первая строка содержит имена столбцов из таблицы, а при вводе первая строка игнорируется.Эта опция разрешена только при использовании формата CSV.

0 голосов
/ 25 июня 2018

Мы не можем использовать это, поскольку наш CSV содержит столбцы заголовков в первой строке, и мы хотим пропустить первую строку.

Итак, просто пропустите первую строку. copyIn() не «перематывает» читатель, которого получает. Вам также не нужно использовать CSVReader. Оператор copy позаботится о разборе файла CSV. Все, что вам нужно сделать, это предоставить читателя, который находится на первой строке, которая должна быть обработана.

Нечто подобное:

CopyManager mgr = new CopyManager(...);

BufferedReader in = new BufferedReader(new FileReader(...));
in.readLine(); // skip the header line

mgr.copyIn("copy target_table from stdin with (...)", in);

Убедитесь, что в команде copy указаны соответствующие параметры, чтобы файл можно было правильно проанализировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...