【发布时间】:2021-09-20 14:13:49
【问题描述】:
我对如何将例如 10 GB 的 .csv 文件插入 MySQL 数据库感兴趣。我使用 pandas 和 pyspark 读取 csv 文件,然后将 csv 标头添加到列表中(如果 csv 文件没有标头,我正在使用 spark 添加它)。然后我正在解析列表并替换 MySQL 插入代码的字符 -->
mydb.cursor().execute("CREATE TABLE " + table_name + " (id INT NOT NULL AUTO_INCREMENT," + column_names + ", PRIMARY KEY (id))")
然后我将没有标题行的整行添加到 list ,然后再次解析以将 'name' 替换为 `name` 。所以我正在编辑列表
query = "insert into `"+ table_name +"` (" + column_names + ") values (" + row_value + ")"
这对于小型 csv 文件非常有效。但是对于大文件,进程会因为内存不足而崩溃。
但是大的 csv 文件呢?是否有将大型 csv 文件数据插入 MySQL 的解决方法?或者您是否有处理大型 csv 文件以将它们插入 MySQL 而不会出现内存不足问题的代码示例?
我认为如果我将大的 csv 文件分成小文件然后插入,它会更好地用于内存。并且可能有一些更好的方法可以将这种大小的数据插入 MySQL。
谢谢。
【问题讨论】:
-
MySQL可以直接使用
LOAD DATA INFILE读取CSV文件。为什么要通过 Python 来做? -
但它需要先创建表对吗?所以我必须阅读 csv 文件才能看到列的名称。我想要上传数据的自动化方式,这就是我想用 Python 来做的原因。
-
Python 可以读取 CSV 的第一行以获取列名并创建表。然后使用
LOAD DATA INFILE将内容加载到表中。但是你会从哪里得到数据类型呢? -
无论如何,
pandas.read_csv()有一个chunksize可选参数。您可以使用它以较小的块处理文件。然后你可以使用df.to_sql()将它们插入到表格中。 -
是的,我用
LOAD DATA INFILE重写了我的代码。它运行良好,没有内存不足的问题现在我正在等待结果。谢谢你的时间@barmar
标签: mysql python-3.x pandas csv pyspark