Консолидация файлов записи и чтения вместе - PullRequest
0 голосов
/ 16 февраля 2019

Я пишу скрипт на python для записи данных в Vertica DB.Я использую официальную библиотеку vertica_db_client.По какой-то причине, если я по какой-то причине использую встроенный метод cur.executemany, он занимает много времени (40+ секунд на 1к записей).Я получил рекомендацию сначала сохранить данные в файл, а затем использовать метод «КОПИЯ».Вот часть файла сохранения в csv:

with open('/data/dscp.csv', 'w') as out:
    csv_out=csv.writer(out)
    csv_out.writerow(("time_stamp", "subscriber", "ip_address", "remote_address", "signature_service_name", "dscp_out", "bytes_in", "bytes_out")) # which is for adding a title line
    for row in data:
        csv_out.writerow(row)

Мои данные - это список кортежей.Вот примеры:

[\
('2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.11', 'SIP', 26, 2911, 4452), \
('2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.21', 'SIP', 26, 4270, 5212), \
('2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.129', '18.215.140.51', 'HTTP2 over TLS', 0, 14378, 5291)\
]

Затем, чтобы использовать метод COPY, я должен (по крайней мере, основываясь на их инструкции https://www.vertica.com/docs/9.1.x/HTML/python_client/loadingdata_copystdin.html), сначала прочитать файл, затем выполнить "COPY from STDIN")Вот мой код

f = open("/data/dscp.csv", "r")
cur.stdin = f
cur.execute("""COPY pason.dscp FROM STDIN DELIMITER ','""")

Вот код для подключения БД, на случай, если она будет иметь отношение к проблеме

import vertica_db_client
user = 'dbadmin'
pwd = 'xxx'
database = 'xxx'
host = 'xxx'
db = vertica_db_client.connect(database=database, user=user, password=pwd, host=host)
cur = db.cursor()

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

Если кто-нибудь может сказать мне, почему мой execute.many был медленным, это было бы одинаково полезно!

Спасибо!

1 Ответ

0 голосов
/ 16 февраля 2019

Прежде всего, да, это рекомендуемый и самый эффективный способ сначала записать данные в файл.Поначалу это может показаться неэффективным, но запись данных в файл на диске займет совсем немного времени, но Vertica не оптимизирована для многих отдельных операторов INSERT.Массовая загрузка - это самый быстрый способ получить большие объемы данных в Vertica.Мало того, но когда вы делаете много отдельных INSERT операторов, вы можете столкнуться с проблемами отката ROS, и даже если вы этого не сделаете, будет дополнительная нагрузка на базу данных, когда контейнеры ROS будут объединены после загрузки.

Вы можете преобразовать ваш массив кортежей в две строковые переменные и затем вывести строку в консоль.

Строка будет выглядеть примерно так:

'2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.11', 'SIP', 26, 2911, 4452
'2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.21', 'SIP', 26, 4270, 5212
'2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.129', '18.215.140.51', 'HTTP2 over TLS', 0, 14378, 5291

Но вместо этогофактически распечатав его на консоль, вы могли бы просто передать его в команду VSQL.

$ python my_script.py | vsql -U dbadmin -d xxx -h xxx -c "COPY pason.dscp FROM STDIN DELIMITER ','"

Это может быть неэффективно.У меня нет большого опыта работы с чрезвычайно длинными строковыми переменными в Python.

Во-вторых, vertica_db_client больше не разрабатывается Vertica.Хотя он все еще будет поддерживаться по крайней мере до конца срока службы python2, вы должны использовать vertica_python.

. Вы можете установить vertica_python с помощью pip.

$ pip install vertica_python

или

$ pip3 install vertica_python

в зависимости от того, с какой версией Python вы хотите его использовать.

Вы также можете собрать исходный код на странице GitHub Vertica https://github.com/vertica/vertica-python/

Что касаетсяиспользуя команду COPY с vertica_python, ответ на этот вопрос см. здесь: Импорт данных в SQL с использованием Python

Я использовал несколько библиотек Python для подключения к Vertica и vertica_python безусловно, мой любимый, и с тех пор, как Vertica переняла разработку от Uber, она продолжала улучшаться на очень регулярной основе.

...