【问题标题】:How to export a large table (100M+ rows) to a text file?如何将大表(100M+ 行)导出到文本文件?
【发布时间】:2013-01-18 20:15:58
【问题描述】:

我有一个包含超过一亿行的大表的数据库。我想导出这些数据(经过一些转换,比如将这个表与其他几个表连接,清理一些字段等)并将其存储到一个大文本文件中,以便以后使用 Hadoop 进行处理。

到目前为止,我尝试了两件事:

  1. 使用 Python,我使用 this subquery trick 按块(通常一次 10'000 条记录)浏览表,对每一行执行转换并直接写入文本文件。这个技巧有帮助,但是随着导出的进行,LIMIT 变得越来越慢。我无法用这个导出完整的表格。

  2. 使用mysql 命令行工具,我尝试将CSV 形式的查询结果直接输出到文本文件。由于体积的原因,它耗尽了内存并崩溃了。

我目前正在研究Sqoop作为将数据直接导入HDFS的工具,但我想知道其他人如何处理如此大规模的导出?

【问题讨论】:

标签: python mysql database hadoop export


【解决方案1】:

内存问题指向使用错误的数据库查询机制。

通常,建议在 C 级别使用 mysql_store_result(),这对应于在 Python 级别使用 CursorDictCursor。这样可以确保数据库尽快再次空闲,并且客户端可以随心所欲地处理数据。

但它不适合大量数据,因为数据缓存在客户端进程中。这可能会非常消耗内存。

在这种情况下,最好使用mysql_use_result() (C) resp。 SSCursor / SSDictCursor (Python)。这限制了您必须获取整个结果集,同时对数据库连接不做任何事情。但它为您的客户端进程节省了大量内存。使用mysql CLI,您可以使用-q 参数实现此目的。

【讨论】:

  • 谢谢,这正是我想要的。很好的解释!
  • 如果我没记错的话,sscursor 可以让你一次获取一个 GOW。但是在一些 python 包中也有一个 fetch many 方法,这是在获取整个结果集和仅一条记录之间的一个很好的折衷
【解决方案2】:

我不知道你到底使用了什么查询,因为你没有在这里给出它,但我想你正在指定限制和偏移量。这是在数据开始时非常快速的查询,但速度很慢。

如果有id等唯一列,只能取前N行,但修改查询子句:

WHERE ID > (last_id)

这将使用索引并且速度可以接受。

不过,一般来说,做简单应该会更快

SELECT * FROM table

并为此类查询打开游标,并具有合理的大获取大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多