我对如何将10GB.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))")
然后,我将没有标题行的整行添加到列表中,然后再次解析以将'name'
替换为`name`
。所以我在为编辑列表
query = "insert into `"+ table_name +"` (" + column_names + ") values (" + row_value + ")"
这非常适用于小型csv文件。但对于大文件,由于内存不足,进程会崩溃。
但是大的csv文件呢?有没有将大型csv文件数据插入MySQL的变通方法?或者,您有使用大型csv文件将其插入MySQL而不会出现内存不足问题的代码示例吗?
我想,如果我把大的csv文件拆分成小的,然后插入,对内存会更好。也许还有一些更好的方法可以将这种大小的数据插入MySQL。
谢谢。
如果您确实想使用Python和Pandas,而不是让MySQL直接读取csv文件的更快方式,那么使用Pandas语法来写入sql。如果您可以将csv文件加载到内存中,那么它应该也可以加载到MySQL中。下面是一个编写MySQL代码的玩具示例,您可能需要许多选项,请参阅https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_sql.html详细信息。
df.to_sql(name=table, con=engine, if_exists='append', index=False, chunksize=10000)
您所做的工作可能有一些问题,无论如何,我提供的都是相同的
首先,如果你试图处理单行插入,也许SQL服务器无法控制请求的速度,导致崩溃,那么为延迟设置计时器可能会有助于
第二,一个INSERT命令可以处理多行,因此,您可以以数千的速度执行puah操作,而不是一次将一行推送到表中
我建议如下:
import time
rows = pd.DataFrame() #your df to be inserted
insert_header = "INSERT INTO table_name "
insert_cols = "(" + ",".join(rows.columns) + ")"
to_sql = rows[rows.columns[0:]].apply(
lambda x: "('" + "','".join(x.fillna(0).astype(str)) + "'),",
axis=1)
counter = to_sql.size
jump = 1000
for i in range(0, counter,jump): #jump
print(jump)
to = min(i + jump, counter)
sql_values = " VALUES " + ''.join(to_sql.iloc[i:to])
exec_sql = insert_header + insert_cols + sql_values
exec_sql = exec_sql[:-1]
cursor.execute(exec_sql)
connection.commit()
time.sleep(2)