这是处理大型CSV文件的最佳方式(Java,MySQL,MongoDB)

时间:2018-02-19 09:42:31

标签: java mysql mongodb csv

我需要使用 +750.000行数据处理大型CSV文件。每行包含 1000+个字符和~50个,我真的不确定最佳(或至少是什么)并且足够的处理和操纵这种数据的方式。

我需要执行以下步骤:

  1. 比较两个Colomns的值将结果写入新列(这个似乎很简单)
  2. 比较两行的值并执行操作。 (例如,如果一个值重复,则删除。)
  3. 比较两个不同文件的值
  4. 我的问题是,目前这已经通过PHP和/或Excel完成,且限制几乎超过 +这需要很长时间才能处理,并且不再可能当文件变得更大时。

    我有 3 不同的可能性:

    1. 使用MySQL ,创建一个(或两个)表并进行比较,添加或删除部分。 (我不熟悉SQL并且必须学习它,它也应该自动完成,因此问题无法创建CSV文件表)< / LI>
    2. 使用Java 在ArrayList或链接列表中创建对象以及&#34;这些东西&#34; (操作很简单,但处理那么多数据可能就是问题) (甚至可以用Java保存那么多文件,还是崩溃/有好工具等。?)
    3. 使用Clojure和MongoDB 将文件从CSV添加到MongoDB并使用Mongo读取文件。
    4. (如果您有其他想法,请列出其他可能性......)

      总而言之,我不是任何一个Pro,但想解决这个问题/得到一些提示甚至你的意见。

      提前致谢

4 个答案:

答案 0 :(得分:0)

我通常使用PostgreSQL来完成这类任务。 PostgreSQL COPY允许轻松导入CSV数据。然后,您将获得一张包含CSV数据和SQL(以及合理数据库)功能的表,以便基本上为数据执行任何操作。

我很确定MySQL具有类似的导入CSV功能,我通常更喜欢PostgreSQL。

我不会使用Java进行CSV处理。这将是太多的代码,除非你处理索引,否则处理将不会有效。对于表格数据处理,SQL数据库要好得多(不应该是一种惊喜)。

我不会使用MongoDB,我的印象是,与SQL数据库相比,它在更新操作方面的功能较弱。但这只是一种观点,带着一点点盐。

答案 1 :(得分:0)

因为在我们公司,我们使用巨大的csv文件工作很多,这里有一些想法:

  • 因为这些文件在我们的情况下总是从其他一些关系数据库导出我们总是使用PostgreSQL,MySQL或golang + SQLite来使用简单的纯SQL查询,在这些情况下最简单可靠的解决方案< / p>

  • 从所有这些数据库的角度来看,您描述的行数非常少,所以不要担心

  • 都具有导入/导出CSV的原生内部解决方案 - 比手动创建的任何内容都快得多

  • 对于重复的标准检查我使用golang + SQLite和:memory:数据库 - 这绝对是最快的解决方案

  • 对于你所描述的检查,MySQL肯定是非常好和快速的,但是数据库的选择还取决于你需要进一步做的复杂分析 - 例如,高达5.7的MySQL仍然没有你需要的窗口函数以后 - 所以在某些情况下也考虑使用PostgreSQL ......

答案 2 :(得分:0)

您应该使用pandas包尝试Python。在具有足够内存(例如16GB)的计算机上,它应该能够轻松处理CSV文件。最重要的是 - 任何有大熊猫经验的人都可以为你开发一个快速的脚本,并在几分钟内告诉你你的工作是否可行。为了帮助您入门:

import pandas
df = pandas.read_csv('filename.csv')

如果遇到内存问题,可能需要指定列类型。

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

答案 3 :(得分:0)

我建议使用Spark。即使在独立的机器中,性能也令人难以置信。您可以使用Scala和Python来处理数据。它非常灵活,您可以在Java或关系数据库中进行不可能的处理。 其他选择也很棒,但我从现在开始考虑Spark对所有分析的需求。