处理大型CSV文件的最佳方法是什么?

Yur*_*uri 5 java architecture sql-server csv

我有一个第三方系统,每天生成大量数据(这些CSV是存储在FTP上的文件).正在生成3种类型的文件:

  • 每15分钟(2个文件).这些文件很小(〜2 Mb)
  • 每天下午5点(〜200 - 300 Mb)
  • 每个午夜(这个CSV文件是关于1 Gb)

整体而言,4 CSV秒的大小是1.5 Gb.但是我们应该考虑到每15分钟生成一些文件.这些数据也应该汇总(不是那么难的过程,但肯定需要时间).我需要快速回复.我正在考虑如何将这些数据和整体存储在实现上.

我们有java堆栈.数据库是MS SQL Standard.从我MS SQL Standard与其他应用程序的测量结果将无法处理此类负载.我想到了什么:

  • 这可能是MS SQL Enterprise单独服务器的升级.
  • 的使用PostgreSQL单独的服务器上.现在我正在为这种方法开发PoC.

你会在这推荐什么?可能有更好的选择.

编辑#1

这些大文件是每天的新数据.

Yur*_*uri 6

好的。在花了一些时间解决这个问题之后(包括阅读、咨询、实验、做几个 PoC)。我想出了以下解决方案。

太;博士

数据库PostgreSQL因为它适合 CSV、免费且开源。

工具Apache Spark非常适合此类任务。很好的表现。

D B

对于数据库来说,决定是一件很重要的事情。选择什么以及未来如何处理如此大量的数据。它绝对应该是一个单独的服务器实例,以便不会在主数据库实例上产生额外的负载,也不会阻塞其他应用程序。

NoSQL

我想到了here的用法Cassandra,但现在这个解决方案太复杂了。Cassandra没有临时查询。Cassandra数据存储层基本上是一个键值存储系统。这意味着您必须围绕所需的查询“建模”数据,而不是围绕数据本身的结构。

关系型数据库管理系统

我不想在这里过度设计。我就在这里停止了选择。

微软SQL服务器

这是一种可行的方法,但最大的缺点是价格。相当昂贵。考虑到我们的硬件,企业版需要花费很多钱。关于定价,您可以阅读这份政策文件

这里的另一个缺点是对 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中您只能获得最后一个结果)。

不管怎样,现在我正在使用JetBrains 的DataGrip 。

加工工具

我浏览过Spring BatchApache SparkSpring Batch对于此任务来说有点太低级了,而且Apache Spark还提供了在将来需要时更容易扩展的能力。不管怎样,Spring Batch也可以完成这项工作。

关于Apache Spark示例,代码可以在learning-spark项目中找到。我现在的选择是Apache Spark 。