使用Python将数据导入SQL
我需要从CSV文件中将30k行数据导入Vertica数据库。我试过的代码需要一个多小时才能完成。我想知道有没有更快的方法?我尝试过使用csv导入,也尝试过通过数据帧循环插入,但速度不够快。事实上,它太慢了。你能帮帮我吗使用Python将数据导入SQL,python,sql,vertica,Python,Sql,Vertica,我需要从CSV文件中将30k行数据导入Vertica数据库。我试过的代码需要一个多小时才能完成。我想知道有没有更快的方法?我尝试过使用csv导入,也尝试过通过数据帧循环插入,但速度不够快。事实上,它太慢了。你能帮帮我吗 rownum=df.shape[0] for x in range(0,rownum): a=df['AccountName'].values[x] b=df['ID'].values[x] ss="INSERT INTO Table (AccountName,ID) VA
rownum=df.shape[0]
for x in range(0,rownum):
a=df['AccountName'].values[x]
b=df['ID'].values[x]
ss="INSERT INTO Table (AccountName,ID) VALUES (%s,%s)"
val=(a,b)
cur.execute(ss,val)
connection.commit()
您想使用
COPY
命令()
这比一次插入每一行要快得多
由于您使用的是python,我建议使用vertica_python
模块,因为它在游标对象()上有一个非常方便的复制方法
将COPY
与vertica python一起使用的语法如下:
with open('file.csv', 'r') as file:
csv_file = file.read()
copy_cmd = "COPY Table FROM STDIN DELIMITER ','"
cur.copy(copy_cmd, csv_file)
connection.commit()
另一件可以加快进程的事情是压缩csv文件。Vertica可以读取gzip、bzip和lzo压缩文件
with open('file.csv.gz', 'r') as file:
gzipped_csv_file = file.read()
copy_cmd = "COPY Table FROM STDIN GZIP DELIMITER ','"
cur.copy(copy_cmd, gzipped_csv_file)
connection.commit()
复制压缩文件将减少网络时间。因此,您必须确定复制压缩文件所节省的时间是否弥补了压缩csv文件所需的额外时间。在我处理过的大多数情况下,压缩文件是值得的。您想使用
COPY
命令()
这比一次插入每一行要快得多
由于您使用的是python,我建议使用vertica_python
模块,因为它在游标对象()上有一个非常方便的复制方法
将COPY
与vertica python一起使用的语法如下:
with open('file.csv', 'r') as file:
csv_file = file.read()
copy_cmd = "COPY Table FROM STDIN DELIMITER ','"
cur.copy(copy_cmd, csv_file)
connection.commit()
另一件可以加快进程的事情是压缩csv文件。Vertica可以读取gzip、bzip和lzo压缩文件
with open('file.csv.gz', 'r') as file:
gzipped_csv_file = file.read()
copy_cmd = "COPY Table FROM STDIN GZIP DELIMITER ','"
cur.copy(copy_cmd, gzipped_csv_file)
connection.commit()
复制压缩文件将减少网络时间。因此,您必须确定复制压缩文件所节省的时间是否弥补了压缩csv文件所需的额外时间。在我处理过的大多数情况下,压缩文件是值得的。立即尝试可能是
val=(df['AccountName'].values.tolist(),df['ID'].values.tolist())
然后使用cur.executemany(ss,val)
而不使用for
循环。这应该更快,但我不确定是否会有进一步的改进。此外,1个缩进空间使该代码难以阅读;您确定connection.commit()
绝对不在for
循环中吗?犯这个错误只需要1个空格。我建议您按照PEP8规则使用4空格。立即尝试可能是val=(df['AccountName'].values.tolist(),df['ID'].values.tolist())
然后使用cur.executemany(ss,val)
而不使用for
循环。这应该更快,但我不确定是否会有进一步的改进。此外,1个缩进空间使该代码难以阅读;您确定connection.commit()
绝对不在for
循环中吗?犯这个错误只需要1个空格。我建议你遵守PEP8规则,使用空格键,非常感谢你的帮助。我能把时间缩短到不到一分钟!这太棒了,非常感谢!只是,并不是所有的行都被复制。我有大约21900行,在我的sql表中只看到21300行。你对此有何看法?嗨,A.桑德斯,你能帮我解释一下为什么有些排被移除了吗?谢谢@Laxmanis您可以使用拒绝的数据
和异常
来查找缺少哪些行以及原因。您需要为每个路径指定一个路径。被拒绝的数据将显示哪些行未被复制,异常显示错误是什么。语法是copytable FROM STDIN GZIP DELIMITER','REJECTED DATA'/path/to/rejections.txt'EXCEPTIONS'/path/to/EXCEPTIONS.txt'代码>。当我使用copy语句时,我总是包含这些选项,但是为了简单起见,我在上面的解释中忽略了它们。嘿,非常感谢你的帮助。我能把时间缩短到不到一分钟!这太棒了,非常感谢!只是,并不是所有的行都被复制。我有大约21900行,在我的sql表中只看到21300行。你对此有何看法?嗨,A.桑德斯,你能帮我解释一下为什么有些排被移除了吗?谢谢@Laxmanis您可以使用拒绝的数据
和异常
来查找缺少哪些行以及原因。您需要为每个路径指定一个路径。被拒绝的数据将显示哪些行未被复制,异常显示错误是什么。语法是copytable FROM STDIN GZIP DELIMITER','REJECTED DATA'/path/to/rejections.txt'EXCEPTIONS'/path/to/EXCEPTIONS.txt'代码>。在使用copy语句时,我总是包含这些选项,但为了简单起见,我在上面的解释中忽略了它们。