[英]Bulk insert into Vertica using Python using Uber's vertica-python package
[英]Bulk insert into vertica using Python
我正在使用 python 将数据(约 800 万行)从 oracle 传输到 vertica。 我写了一个 python 脚本,它在 2 小时内传输数据,但我正在寻找提高传输速度的方法。
我正在使用的过程:
dataframe.to_sql
方法,但是这个方法仅限于几个数据库有没有人使用更好的方法(批量插入或任何其他方法?)使用 python 将数据插入 vertica?
这是代码片段:
df = pandas.read_sql_query(sql,conn)
conn_vertica = pyodbc.connect("DSN=dsnname")
cursor = conn_vertica.cursor()
for i,row in df.iterrows():
cursor.execute("insert into <tablename> values(?,?,?,?,?,?,?,?,?)",row.values[0],row.values[1],row.values[2],row.values[3],row.values[4],row.values[5],row.values[6],row.values[7],row.values[8])
cursor.close()
conn_vertica.commit()
conn_vertica.close()
来自vertica-python
代码https://github.com/uber/vertica-python/blob/master/vertica_python/vertica/cursor.py
with open("/tmp/file.csv", "rb") as fs: cursor.copy("COPY table(field1,field2) FROM STDIN DELIMITER ',' ENCLOSED BY '\\"'", fs, buffer_size=65536)
在 Vertica 中执行单行插入非常低效。 您需要批量加载。
我们这样做的方法是使用 COPY 命令,这是一个示例:
COPY mytable (firstcolumn, secondcolumn) FROM STDIN DELIMITER ',' ENCLOSED BY '"';
您是否考虑过使用现有的库,例如vertica-python
查看此链接指向 Vertica 的文档,了解有关 COPY 选项的更多信息
如果您想将数据帧而不是 csv 文件加载到 Vertica 表中,您可以使用以下命令:
from vertica_python import connect
db_connection = connect(host = 'hostname'
,port = 5433
,user = 'user', password = 'password'
,database = 'db_name'
,unicode_error = 'replace')
cursor = db_connection.cursor()
cursor.copy("COPY table_name (field1, field2, ...) from stdin DELIMITER ','", \
df.to_csv(header=None, index=False)\
)
下面这部分是有区别的,它将内存中的数据帧转换为复制命令可以读取的逗号分隔的字符串行:
df.to_csv(header=None, index=False)
它的工作速度非常快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.