Импорт данных в SQL с использованием Python - PullRequest
0 голосов
/ 28 января 2019

Мне нужно импортировать 30 тыс. Строк данных из файла CSV в базу данных Vertica.Код, который я пробовал, занимает больше часа, чтобы сделать это.Мне интересно, есть ли более быстрый способ сделать это?Я пытался импортировать, используя CSV, а также циклически перебирая кадры данных для вставки, но это не достаточно быстро.На самом деле, это слишком медленно.Не могли бы вы помочь мне?

rownum=df.shape[0]
for x in range(0,rownum):
 a=df['AccountName'].values[x]
 b=df['ID'].values[x]
 ss="INSERT INTO Table (AccountName,ID) VALUES (%s,%s)"
 val=(a,b)
 cur.execute(ss,val)

connection.commit()

1 Ответ

0 голосов
/ 28 января 2019

Вы хотите использовать команду COPY ( COPY ).

COPY Table FROM '/path/to/csv/file.csv' DELIMITER ',';

Это намного быстрее, чем вставка каждой строки за раз.

Так каквы используете python, я бы порекомендовал модуль vertica_python, поскольку он имеет очень удобный метод копирования для объекта курсора ( vertica-python GitHub page ).

Синтаксис для использования COPY с vertica-python выглядит следующим образом:

with open('file.csv', 'r') as file:
    csv_file = file.read()
    copy_cmd = "COPY Table FROM STDIN DELIMITER ','"
    cur.copy(copy_cmd, csv_file)
    connection.commit()

Еще одна вещь, которую вы можете сделать для ускорения процесса, - это сжатие файла CSV.Vertica может читать сжатые файлы gzip, bzip и lzo.

with open('file.csv.gz', 'r') as file:
    gzipped_csv_file = file.read()
    copy_cmd = "COPY Table FROM STDIN GZIP DELIMITER ','"
    cur.copy(copy_cmd, gzipped_csv_file)
    connection.commit()

Копирование сжатых файлов сократит сетевое время.Таким образом, вы должны определить, компенсируется ли дополнительное время, необходимое для сжатия файла csv, за время, сэкономленное при копировании сжатых файлов.В большинстве случаев, с которыми я сталкивался, стоит сжать файл.

...