Приложение Java Desktop для загрузки файлов CSV в базу данных

Я работаю над настольным приложением (тип приложения «Extract Transform Load»), которое требует загрузки больших файлов CSV (около 6 ГБ) в базу данных с использованием Java в качестве интерфейса и Oracle в качестве сервера, но я открыт для других баз данных и инструментов. также (например, SQLite, H2, HSQLDB, MySQL).

Я попытался использовать библиотеки Java OpenSource для анализа и загрузки файлов CSV, таких как:

  1. OpenCSV
  2. Super CSV

Проблема этих библиотек в эффективности. Они требуют слишком много времени для загрузки. Например, для загрузки 4 Гб CSV-файла потребуется 6 часов.

Имея такой опыт, я решил попробовать утилиты баз данных для загрузки файлов CSV. Одним из них является Oracle SQL*Loader. Это быстрее и дает желаемый результат. Он может удалять пробелы, загружать файлы CSV в различные таблицы, использовать функции оракула, такие как декодирование и т. д.

Однако у меня есть следующие проблемы:

  1. Я не смог найти способ получить ошибки/журналы SQL*Loader в Java и отобразить их пользователю.

  2. Так как SQL*Loader является проприетарным, нет возможности встроить его в установку моего приложения. Например, перед установкой моего приложения пользователю необходимо загрузить и установить Oracle Client отдельно. Другое дело, что мне нужно проверить, установлен ли клиент Oracle до начала процесса установки.

Я искал другие возможные решения и нашел безголовые базы данных, такие как SQLite и H2.

В SQLite я использую команду .import для загрузки файлов CSV. Но я никак не мог назвать это на Java.

Я обращаюсь к базе данных H2, но мне трудно загрузить ее, поскольку она не поддерживает экранирование строки заголовка.

Пожалуйста, дайте мне знать ваши предложения.

Спасибо.


person epsac    schedule 11.10.2011    source источник
comment
Вы должны использовать SQLite? Нельзя ли использовать внешние таблицы для загрузки данных? Исключить верхние и нижние колонтитулы легко с помощью внешних таблиц.   -  person Ollie    schedule 11.10.2011
comment
Нисколько. Я создаю настольное приложение java, которое может загружать большой файл .csv в мою локальную базу данных как можно быстрее, независимо от базы данных.   -  person epsac    schedule 12.10.2011


Ответы (3)


Похоже, для этого можно использовать CloverETL. Это инструмент интеграции данных и ETL на основе Java. Наряду с коммерческими выпусками у него есть бесплатный движок ETL с открытым исходным кодом. Его должно быть довольно легко встроить в ваше приложение в виде библиотеки Java. У вас также не должно быть проблем с производительностью, о которых вы упоминали выше, если только узкое место не находится на стороне БД. Говорят, что CloverETL работает быстро.

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

person Jan Tichy    schedule 13.10.2011
comment
Большое спасибо! Это очень поможет в моем проекте. :-) - person epsac; 17.10.2011

Если у вас есть оболочка bash, вы можете сделать это:

sqlite3 my_database_file <<< .import <(gawk 'NR>1 { a = $0; if(NR>2){print a;}}' my_csv_file) my_table_name
person Benoit    schedule 11.10.2011
comment
Спасибо, но у меня нет bash. Я работаю на платформе Windows. Кстати, это не обязательно должен быть SQLite. Это может быть другая база данных, которая может быть встроена в мое настольное приложение Java и может молниеносно загружать большие CSV-файлы. - person epsac; 12.10.2011
comment
@user692533 user692533 Да, если вы устанавливаете Cygwin (не знаю, лучшее ли это решение, просто говорю). - person Dave Newton; 13.10.2011

Я предполагаю, что вы используете утилиту управления командной строкой SQLITE.

Самый простой способ сделать это — удалить строки заголовка и нижнего колонтитула из файла импорта перед его импортом в sqlite, используя любую функцию редактирования, которая вам наиболее удобна в вашей системе.

Если файл примера, который вы разместили, точен, вам все равно придется сделать это, поскольку последняя строка, содержащая только один столбец, будет отклонена командой SQLITE .import, что приведет к прерыванию всего ввода.

Если вы исправите проблему с нижним колонтитулом и настаиваете на использовании команд SQLITE, вот предлагаемый метод:

Исправить нижний колонтитул

HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2

Сделать импорт

sqlite> select * from test;
HEADER1, HEADER2, HEADER3
row1,row2,row3
row11,row22,row33
row111,row222,row33
FOOTER, FOOT1, FOOT2

Удалить нижний колонтитул

sqlite> select count() from test;
5
sqlite> delete from test where rowid=5;

Удалить заголовок

sqlite> delete from test where rowid=1;
sqlite> select * from test;
row1,row2,row3
row11,row22,row33
row111,row222,row33
person ravenspoint    schedule 11.10.2011
comment
Спасибо за помощь. Поправьте меня, если я ошибаюсь, но я понимаю, что не могу использовать SQLite, так как в нем отсутствуют функции для импорта большого файла csv в java. - person epsac; 12.10.2011
comment
Вы должны были упомянуть в своем вопросе, что используете java. Если вы добавите тег java, вы привлечете внимание экспертов по java. Вкратце, вы должны написать код Java для чтения вашего CSV-файла, его анализа и создания необходимых операторов SQL INSERT. Эта процедура будет одинаковой, независимо от того, какое ядро ​​базы данных вы используете. - person ravenspoint; 12.10.2011
comment
Спасибо за ваше предложение. Я уже добавил java в свои теги и перефразировал свой вопрос. - person epsac; 13.10.2011