What is the best way to process large CSV files?

java sql-server csv architecture

5416 просмотра

4 ответа

1498 Репутация автора

I have a third party system that generates a large amount of data each day (those are CSV files that are stored on FTP). There are 3 types of files that are being generated:

  • every 15 minutes (2 files). These files are pretty small (~ 2 Mb)
  • everyday at 5 PM (~ 200 - 300 Mb)
  • every midnight (this CSV file is about 1 Gb)

Overall the size of 4 CSVs is 1.5 Gb. But we should take into account that some of the files are being generated every 15 minutes. These data should be aggregated also (not so hard process but it will definitely require time). I need fast responses. I am thinking how to store these data and overall on the implementation.

We have java stack. The database is MS SQL Standard. From my measurements MS SQL Standard with other applications won't handle such load. What comes to my mind:

  • This could be an upgrade to MS SQL Enterprise with the separate server.
  • Usage of PostgreSQL on a separate server. Right now I'm working on PoC for this approach.

What would you recommend here? Probably there are better alternatives.

Edit #1

Those large files are new data for the each day.

Автор: Yuri Источник Размещён: 18.07.2016 05:15

Ответы (4)


1 плюс

1620 Репутация автора

You might consider looking into the Apache Spark project. After validating and curating the data maybe use Presto to run queries.

Автор: Radu Размещён: 18.07.2016 07:38

0 плюса

107 Репутация автора

Pentaho Data Integration (или аналогичный инструмент ETL) может обрабатывать импорт данных в базу данных SQL и выполнять агрегацию на лету. PDI имеет версию для сообщества и может запускаться отдельно или через API Java.

Автор: lukfi Размещён: 18.07.2016 07:44

1 плюс

4905 Репутация автора

Вы можете использовать uniVocity-парсеры для максимально быстрой обработки CSV, поскольку эта библиотека поставляется с самым быстрым анализатором CSV. Я являюсь автором этой библиотеки, и она с открытым исходным кодом и бесплатная (Лицензия Apache V2)

Теперь для загрузки данных в базу данных вы можете попробовать платформу Univocity (коммерческую). Мы используем его для очень быстрой загрузки больших объемов данных в базы данных, такие как SQL-сервер и PostgreSQL, - от 25 до 200 тыс. Строк в секунду, в зависимости от базы данных и ее конфигурации.

Вот простой пример того, как будет выглядеть код для миграции из CSV:

public static void main(String ... args){
    //Configure CSV input directory
    CsvDataStoreConfiguration csv = new CsvDataStoreConfiguration("csv");
    csv.addEntitiesFromDirectory(new File("/path/to/csv/dir/"), "ISO-8859-1");

    //should grab column names from CSV files
    csv.getDefaultEntityConfiguration().setHeaderExtractionEnabled(true);

    javax.sql.DataSource dataSource = connectToDatabaseAndGetDataSource(); //specific to your environment

    //Configures the target database
    JdbcDataStoreConfiguration database = new JdbcDataStoreConfiguration("database", dataSource);

    //Use only for postgres - their JDBC driver requires us to convert the input Strings from the CSV to the correct column types.
    database.getDefaultEntityConfiguration().setParameterConversionEnabled(true);

    DataIntegrationEngine engine = Univocity.getEngine(new EngineConfiguration(csv, database));

    //Creates a mapping between data stores "csv" and "database"
    DataStoreMapping mapping = engine.map(csv, database);

    // if names of CSV files and their columns match database tables an their columns
    // we can detect the mappings from one to the other automatically
    mapping.autodetectMappings();

    //loads the database.
    engine.executeCycle();

}

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

Надеюсь это поможет.

Автор: Jeronimo Backes Размещён: 19.07.2016 02:05

1 плюс

1498 Репутация автора

Решение

Хорошо. Проведя некоторое время с этой проблемой (она включает в себя чтение, консультации, эксперименты, выполнение нескольких PoC). Я придумал следующее решение.

Tl; др

База данных : PostgreSQLкак это хорошо для CSV, бесплатно и с открытым исходным кодом.

Инструмент : Apache Spark хорошо подходит для таких задач. Хорошее исполнение.

база данных

Что касается базы данных, это важно принять решение. Что выбрать и как это будет работать в будущем с таким количеством данных. Это определенно должен быть отдельный экземпляр сервера, чтобы не создавать дополнительную нагрузку на основной экземпляр базы данных и не блокировать другие приложения.

NoSQL

Я думал об использовании Cassandraздесь, но это решение было бы слишком сложным сейчас. Cassandraне имеет специальных запросов. CassandraУровень хранения данных в основном представляет собой систему хранения ключ-значение. Это означает, что вы должны «моделировать» свои данные вокруг необходимых запросов, а не вокруг структуры самих данных.

RDBMS

Я не хотел переусердствовать здесь. И я остановил выбор здесь.

MS SQL Server

Это путь, но большим недостатком здесь является ценообразование. Довольно дорого. Корпоративная версия стоит больших денег с учетом нашего оборудования. Что касается цен, вы можете прочитать этот документ политики .

Еще одним недостатком здесь была поддержка файлов CSV. Это будет основным источником данных для нас здесь. MS SQL Serverне может ни импортировать, ни экспортировать CSV.

  • MS SQL Server молча обрезая текстовое поле.

  • MS SQL Serverобработка кодировки текста идет не так.

MS SQL Server выдает сообщение об ошибке, потому что не понимает цитирование или экранирование. Больше об этом сравнении можно найти в статье PostgreSQL против MS SQL Server .

PostgreSQL

Эта база данных является зрелым продуктом и хорошо проверена в боевых условиях. Я слышал много положительных отзывов об этом от других (конечно, есть и некоторые компромиссы). У него более классический синтаксис SQL, хорошая поддержка CSV, более того, он с открытым исходным кодом.

Стоит отметить , что SSMS способ лучше , чем PGAdmin . SSMS имеет функцию автозаполнения, несколько результатов (когда вы запускаете несколько запросов и получаете несколько результатов одновременно, но в PGAdmin вы получаете только последний).

Во всяком случае, сейчас я использую DataGrip от JetBrains.

Инструмент обработки

Я просмотрел Spring Batch и Apache Spark . Spring Batch - слишком низкоуровневая вещь, чтобы использовать ее для этой задачи, а также Apache Spark предоставляет возможность более простого масштабирования, если это потребуется в будущем. В любом случае, Spring Batch также может выполнить эту работу.

Что касается примера Apache Spark , код можно найти в проекте Learning- Spark . Мой выбор сейчас Apache Spark .

Автор: Yuri Размещён: 23.08.2016 10:53
Вопросы из категории :
32x32