0

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

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

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

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

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

4

2 回答 2

2

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

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

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

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

于 2013-01-18T12:15:58.510 回答
1

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

如果你有唯一的列,比如 ID,你只能获取前 N 行,但是修改查询子句:

WHERE ID > (last_id)

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

但是,简单地做通常应该更快

SELECT * FROM table

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

于 2013-01-18T11:53:29.627 回答