【问题标题】:Bulk insert into vertica using Python使用 Python 批量插入 vertica
【发布时间】:2015-09-18 18:40:13
【问题描述】:

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

我正在使用的流程:

  • 连接到 Oracle
  • 将数据拉入数据框(熊猫)
  • 逐一迭代数据帧中的行并插入到vertica(cursor.execute),我想使用dataframe.to_sql方法,但此方法仅限于几个数据库

有没有人使用更好的方法(批量插入或任何其他方法?)使用 python 将数据插入到 vertica?

这里是代码sn-p:

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()

【问题讨论】:

    标签: python bulkinsert vertica


    【解决方案1】:

    来自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)

    【讨论】:

    • 我想从 python 运行这个命令,我该怎么做?复制 cb.table_format2 FROM LOCAL 'C:\Users\Waqas Ali\Desktop\upload.csv' ENCLOSED BY '"' delimiter ',' SKIP 1 exceptions 'C:\Users\Waqas Ali\Desktop\except.csv' 拒绝数据'C:\Users\Waqas Ali\Desktop\reject.csv'; 当我使用 vertica 客户端运行此命令时,它工作正常。但是当我从 python 执行此命令时,它仅从给定文件复制数据,但不会创建新文件拒绝数据的文件。
    • 我在python中使用了这段代码。与 open(file_path, "rb") as inf: cur.copy(copy_command, inf)
    【解决方案2】:

    在 Vertica 中执行单行插入效率非常低。您需要分批加载。

    我们这样做的方式是使用 COPY 命令,这里是一个例子:

    COPY mytable (firstcolumn, secondcolumn) FROM STDIN DELIMITER ',' ENCLOSED BY '"';
    

    您是否考虑过使用现有库,例如vertica-python

    查看this link to Vertica's docs 了解有关复制选项的更多信息

    【讨论】:

    • 克里斯,要使用复制命令,源应该是一个文件,在我的程序中我已经将数据放在一个数据框中,如果我想使用复制命令,那么我将不得不写内容将数据框复制到文件中,然后使用 COPY 命令,不确定它是否对我有那么大的帮助。您是否将 COPY 命令与数据框一起使用?还是将数据帧写入文件,然后在 COPY 命令中使用它来解决这个问题?
    • 它不需要是文件,您可以直接从内存中加载 - vertica-python 文档显示了一种方法。
    • @UdayShankar from github.com/uber/vertica-python/blob/master/vertica_python/… ``` with open("/tmp/file.csv", "rb") as fs: cursor.copy("COPY table(field1,field2) FROM STDIN DELIMITER ',' 由 '\"'" 包围,fs, buffer_size=65536) ``
    【解决方案3】:

    如果您想将数据框而不是 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)
    

    它的工作速度非常快。

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多