Pandas DataFrame для Vertica таблицы вставки быстрее - PullRequest
0 голосов
/ 12 июня 2018

У меня есть такой код ... он работает нормально, но загрузка данных в vertica занимает слишком много времени.около 10 минут на 1000 строк.Есть ли альтернативный / более быстрый способ вставить данные в Vertica.

import pandas as pd
import vertica_python

conn_info = {'host': '127.0.0.1',
         'user': 'some_user',
         'password': 'some_password',
         'database': 'a_database'}

connection = vertica_python.connect(**conn_info)

df = pd.DataFrame({'User':['101','101','101','102','102','101','101','102','102','102'],'Country':['India','Japan','India','Brazil','Japan','UK','Austria','Japan','Singapore','UK']})

lists= df.values.tolist()

with connection.cursor() as cursor:
    for x in lists:
        cursor.execute("insert into test values (%s,%s)" , x)
        connection.commit()

Спасибо

1 Ответ

0 голосов
/ 16 июня 2018

Вы должны использовать опцию cursor.copy вместо cursor.execute.

Например:

# add new import:
import cStringIO
...
# temporary buffer
buff = cStringIO.StringIO()

# convert data frame to csv type
for row in df.values.tolist():
    buff.write('{}|{}\n'.format(*row))

# now insert data
with connection.cursor() as cursor:
    cursor.copy('COPY test (Country, "User") FROM STDIN COMMIT' , buff.getvalue())

В моей системе тестирования следующие результаты

вашей реализации:

$ time ./so.py
real    0m4.175s
user    0m0.523s
sys 0m0.101s

моя реализация:

$ time ./so.py
real    0m0.814s
user    0m0.530s
sys 0m0.078s

в 5 раз быстрее (4,175 с против 0,814 с).

...