我正在使用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()
答案 0 :(得分:2)
来自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)
答案 1 :(得分:0)
对Vertica执行单行插入效率非常低。您需要批量加载。
我们这样做的方法是使用COPY命令,这是一个例子:
COPY mytable (firstcolumn, secondcolumn) FROM STDIN DELIMITER ',' ENCLOSED BY '"';
您是否考虑过使用现有的资源库,例如vertica-python
查看this link to Vertica's docs以获取有关COPY选项的更多信息
答案 2 :(得分:0)
如果您想将数据帧而不是 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)
它工作得非常快。