如何将一个大表(100m+行)导出到一个文本文件?

mzaanser  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(408)

我有一个包含超过一亿行的大表的数据库。我想导出这些数据(在一些转换之后,比如把这个表和其他一些表连接起来,清理一些字段等等),并将其存储在一个大的文本文件中,以便以后使用hadoop进行处理。
到目前为止,我尝试了两件事:
使用python,我使用这个子查询技巧按块(通常一次浏览10000条记录)浏览表,对每行执行转换并直接写入文本文件。技巧有帮助,但是 LIMIT 在导出过程中会变得越来越慢。我不能用这个导出整个表。
使用 mysql 命令行工具,我试图将查询结果输出到 CSV 直接形成文本文件。因为它太大,内存不足,崩溃了。
我目前正在研究sqoop作为将数据直接导入到 HDFS ,但我想知道其他人是如何处理如此大规模的出口的?

dgiusagp

dgiusagp1#

我不知道您到底使用了什么查询,因为您没有在这里给出它,但我想您指定的是限制和偏移量。这是在数据开始时非常快速的查询,但速度非常慢。
如果具有唯一列(如id),则只能获取前n行,但要修改query子句:

WHERE ID > (last_id)

这将使用索引,速度可以接受。
不过,一般来说,做简单的事情应该更快

SELECT * FROM table

打开游标进行查询,取数大小合理。

k4emjkb1

k4emjkb12#

内存问题指向使用错误的数据库查询机制。
通常,建议使用 mysql_store_result() 在c级,对应于 Cursor 或者 DictCursor 在python级别。这样可以确保数据库尽快恢复可用状态,客户机可以随心所欲地处理数据。
但是它不适合于大量的数据,因为数据是缓存在客户机进程中的。这可能非常消耗内存。
在这种情况下,使用 mysql_use_result() (c) 负责。 SSCursor / SSDictCursor (Python)。这就限制了您必须获取整个结果集,同时对数据库连接不做任何其他操作。但是它节省了你的客户端进程很多内存。与 mysql cli,您可以通过 -q 争论。

相关问题