使用Python批量插入vertica

时间:2015-09-18 18:40:14

标签: python bulkinsert vertica

我正在使用python将数据(约800万行)从oracle传输到vertica。我写了一个python脚本,它在2小时内传输数据,但我正在寻找提高传输速度的方法。

我正在使用的流程:

  • 连接到Oracle
  • 将数据拉入数据框(pandas)
  • 逐个迭代数据框中的行并插入vertica(cursor.execute),我想使用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()

3 个答案:

答案 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)

它工作得非常快。