我将需要从CSV文件将3万行数据导入到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) VALUES (%s,%s)"
val=(a,b)
cur.execute(ss,val)
connection.commit()
答案 0 :(得分:2)
您要使用COPY
命令(COPY)。
COPY Table FROM '/path/to/csv/file.csv' DELIMITER ',';
这比一次插入每一行要快得多。
由于您使用的是python,因此我建议使用vertica_python
模块,因为它在其光标对象(vertica-python GitHub page)上具有非常方便的复制方法。
将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文件所需的额外时间是否弥补了复制压缩文件所节省的时间。在大多数情况下,压缩文件是值得的。