如何根据日期列在不同的文本/csv文件中转储一个巨大的mysql表?

Posted

技术标签:

【中文标题】如何根据日期列在不同的文本/csv文件中转储一个巨大的mysql表?【英文标题】:How to dump a huge mysql table in different text/csv files based on the date column? 【发布时间】:2021-10-21 03:59:09 【问题描述】:

我有一个包含数百万条记录的巨大 mysql 表。我有一个用例,根据日期列,我想将结果拆分并转储到不同的文本文件中。

例如:

col_1 col_2 date_col
a     b      20-12-2021 
a     b      20-12-2021 
a2    b2     21-12-2021
..    ..     ...

所以row1row2 将转到名为20_12_2021.csv 的CSV,row3 将转到21_12_2021.csv。我现在正在做的是我正在使用 Python 来获取结果,然后逐行循环,然后确定结果将去哪里,但这需要很长时间。

有没有更好更优化的方法来做到这一点?

【问题讨论】:

您是如何将表格从MySQL 读取到pandas,或者您已经将数据转储到CSV 并且现在只是解析相同?有不错的so post, MySQL : retrieve a large select by chunks 现在,我将结果放入 1000 行的块中并对其进行迭代。 如果没有敏感信息,您应该发布您的代码,以获得正确的建议或解决方案,因为我看到即使使用 chunksize 也无助于减少内存,我已经提到了一些参考资料你可以检查一下。 @KarnKumar ,代码在我的办公室笔记本电脑上,我无法复制粘贴。我将尝试创建一个示例代码。请允许我一段时间。 阿提夫,我明白了。 【参考方案1】:

我喜欢这个解决方案,您可以在其中使用 df.groupbydate_col 列,这将使用映射器或轴上的一系列列对 DataFrame 进行分组 0 默认情况下,并表示行。

解决方案:

for name, g in df.groupby('date_col'):
    g.to_csv(f'name.csv', index=False)

Result:

$ cat 20-12-2021.csv  <-- CSV file created

col_1,col_2,date_col
a,b,20-12-2021
a,b,20-12-2021

$ cat 21-12-2021.csv   <-- CSV file created

col_1,col_2,date_col
a2,b2,21-12-2021

df.groupby('date_col').apply(lambda x: x.to_csv('.csv'.format(x.name), index=False))

注意:如果您对 MYSQL 有效地了解一百万行,那么@ThePhysicist 的Pandas now has built-in support for chunked loading 有一个很好的答案。

阿劳看Reading table with chunksize still pumps the memory

【讨论】:

让我试试这个。 既然这是一张巨大的桌子,把它放在内存中不是问题吗? .由于 pandas 将数据帧转储到内存中。 尝试使用lambda 函数,如df.groupby('date_col').apply(lambda x: x.to_csv('.csv'.format(x.name), index=False))

以上是关于如何根据日期列在不同的文本/csv文件中转储一个巨大的mysql表?的主要内容,如果未能解决你的问题,请参考以下文章

将稀疏矩阵转储到文件中

在python中识别csv

从命令行将 mysql 数据库转储到纯文本 (CSV) 备份

CSV > Calc - 文本到日期

多日期数据加载到 BigQuery 分区表中

我们如何使用Windows Powershell脚本替换文本文件中的日期?