【问题标题】:Which is the best way to handle big CSV files (Java, MySQL, MongoDB)哪种是处理大型 CSV 文件(Java、MySQL、MongoDB)的最佳方式
【发布时间】:2018-02-19 09:42:31
【问题描述】:

我需要处理一个大型 CSV 文件,其中包含大约 +750.000 行数据。每行大约有 1000+ 个字符 和约 50 个,我真的不知道什么是 最好的(或至少是好的和足够的)处理和操作此类数据的方法。

我需要执行以下步骤:

  1. 比较两个列的值将结果写入新列(这个看起来很简单)
  2. 比较两行的值并做一些事情。 (例如,如果一个值重复,则删除。)
  3. 比较两个不同文件的值

我的问题是,目前这是使用 PHP 和/或 Excel 完成的,并且限制几乎超过 + 这需要很长时间来处理并且将不再可能 当文件变得更大时。

我想到了 3 种不同的可能性:

  1. 使用 MySQL,创建一个(或两个)表并进行比较、添加或删除部分。 (我对 SQL 不是很熟悉,必须学习它,而且它应该是自动完成的,所以存在 问题,您无法创建 CSV 文件表
  2. 使用 Java 在 ArrayList 或链接列表中创建 对象 并创建“东西”(操作很容易,但处理这么多数据可能会成为问题强>) (是否可以在 Java 中保存这么多文件还是会崩溃/是否有好工具等?)
  3. 结合使用 Clojure 和 MongoDB 将文件从 CSV 添加到 MongoDB 并使用 Mongo 读取文件。

(如果您有其他想法,请说出其他可能性..)

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

提前致谢

【问题讨论】:

  • 你应该说比较两行的值比较两个不同文件的值是什么意思。如果您只需要比较一个标识符(可能由多个字段组成),数据库表上的唯一索引可能会有所帮助。
  • 如果您显示您的 cvs 文件的一部分可能会有所帮助,那么我们就知道您在说什么。
  • 抱歉解释不准确。该文件带有某些产品的 ID 等值,如果这些 ID 重复,则必须删除其中一个。如果它们的价值不同,另一种情况是与列(例如旧价格和新价格)进行比较。我希望这更清楚。
  • 不要在 Java 中这样做,省去编写大量代码的麻烦。
  • Postgres 是最简单的解决方案,而且它会帮助您永远了解如何使用它,所以您现在应该学习。

标签: java mysql mongodb csv


【解决方案1】:

由于在我们公司,我们经常处理巨大的 csv 文件,这里有一些想法:

    1234563 /p>
  • 从所有这些数据库的角度来看,您描述的行数非常低,所以不用担心

  • 都有用于导入/导出 CSV 的本地内部解决方案 - 这比手动创建的任何东西都快得多

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

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

【讨论】:

  • "例如 MySQL 到 5.7 仍然没有您以后可能需要的窗口函数" 好消息 MySQL 8.0 正在开发中,它支持窗口函数。
  • 到目前为止,我在使用 MySQL-Workbench 的导入工具导入 CSV 文件(甚至更小)时遇到了麻烦,因为它无法读取除 ASCII 之外的某些字符。问题是,PostgeSQL 有这种工具吗?这是一个必须每周至少处理一次不同/新 CSV 文件的过程,那么 PostgreSQL 可以自动创建表吗?
  • 但是如何将 CSV 文件导入到具有相应 cloumns 的新表中? 我搜索了好几天都没有找到解决方案,它仅限于一定的大小,或由于错误的编码错误而取消-
【解决方案2】:

我通常使用PostgreSQL 来完成这类任务。 PostgreSQL COPY 允许轻松导入 CSV 数据。然后,您将获得一个包含 CSV 数据的表格,并且 SQL(以及一个合理的数据库)基本上可以对数据执行任何您想要的操作。

我很确定 MySQL 具有类似的导入 CSV 的功能,我只是一般更喜欢 PostgreSQL。

我不会将 Java 用于 CSV 处理。这将是太多代码,除非您处理索引,否则处理将无法执行。 SQL 数据库更适合用于表格数据处理(应该不足为奇)。

我不会使用 MongoDB,我的印象是它在更新操作方面不如 SQL 数据库强大。但这只是一个意见,持保留态度。

【讨论】:

  • 到目前为止,我使用的是 MySQL Workbench,它通常提供一个从 csv 文件创建表的工具。但是该导入工具不接受编码。但除此之外,您不建议使用 Java(或 Clojure)吗?我去看看postgreSQL,谢谢
  • 嘿,抱歉再次询问,但是是否可以在 PostgreSQL 中基于该 CSV 文件的第一行创建一个新表?到目前为止,我已经读过,需要事先创建一个表。
  • @NICK_WANTED 据我从COPY 命令的语法来看,table_name 是事先需要的。
【解决方案3】:

您应该尝试 Python 与 pandas 包。在具有足够内存(例如 16GB)的机器上,它应该能够轻松处理您的 CSV 文件。最重要的是 - 任何对 pandas 有一定经验的人都可以为您开发一个快速脚本,并在几分钟内告诉您您的工作是否可行。为了让您开始:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • Spark 是一个很棒的工具,但问题是它只是忽略了具有空值的键。但这是一个很棒的功能,但它应该是可配置的。
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多