Массовая вставка в Vertica с использованием Python с использованием пакета Uber vertica-python

вопрос 1 из 2

Я пытаюсь импортировать данные из CSV-файла в Vertica, используя Python, используя пакет Uber vertica-python. Проблема заключается в том, что элементы данных только для пробелов загружаются в Vertica в виде NULL; Я хочу, чтобы только пустые элементы данных загружались как пустые, а непустые элементы данных были загружены как пустые.

Например, следующие две строки файла CSV загружаются в базу данных как ('1','abc',NULL,NULL), тогда как я хочу, чтобы вторая была загружена как ('1','abc',' ',НОЛЬ).

1,abc,,^M
1,abc,  ,^M

Вот код:

# import vertica-python package by Uber
#   source: https://github.com/uber/vertica-python
import vertica_python

# write CSV file
filename = 'temp.csv'
data = <list of lists, e.g. [[1,'abc',None,'def'],[2,'b','c','d']]>
with open(filename, 'w', newline='', encoding='utf-8') as f:
        writer = csv.writer(f, escapechar='\\', doublequote=False)
        writer.writerows(data)

# define query
q = "copy <table_name> (<column_names>) from stdin "\
    "delimiter ',' "\
    "enclosed by '\"' "\
    "record terminator E'\\r' "

# copy data
conn = vertica_python.connect( host=<host>,
                               port=<port>,
                               user=<user>,
                               password=<password>,
                               database=<database>,
                               charset='utf8' )
cur = conn.cursor()
with open(filename, 'rb') as f:
    cur.copy(q,  f)
conn.close()

Вопрос 2 из 2

Есть ли какие-либо другие проблемы (например, кодировка символов), на которые я должен обратить внимание при использовании этого метода загрузки данных в Vertica? Есть ли другие ошибки в коде? Я не уверен на 100%, что это будет работать на всех платформах (в настоящее время работает на Linux; например, могут быть проблемы с терминатором записи на других платформах). Будем весьма благодарны за любые рекомендации по повышению надежности этого кода.

Кроме того, существуют ли альтернативные методы массовой вставки данных в Vertica из Python, такие как загрузка объектов непосредственно из Python вместо того, чтобы сначала записывать их в файлы CSV, не жертвуя скоростью? Объем данных большой, а задание на вставку само по себе занимает несколько часов.

Заранее благодарю за любую помощь, которую вы можете оказать!

1 ответ

Решение

Оператор копирования, который у вас есть, должен работать так, как вы хотите, в отношении пробелов. Я проверил, используя очень похожий COPY,

Редактировать: я пропустил то, что вы действительно просили с копией, я оставлю эту часть, потому что это может все еще быть полезным для некоторых людей:

Чтобы исправить пробел, вы можете изменить свой оператор копирования:

copy <table_name> (FIELD1, FIELD2, MYFIELD3 AS FILLER VARCHAR(50), FIELD4, FIELD3 AS NVL(MYFIELD3,'') ) from stdin

Используя filler, он разберется с чем-то вроде переменной, которую вы затем можете назначить фактическому полю таблицы, используя AS позже в копии.

Что касается любых ошибок... Я часто делаю то, что у тебя есть на Солярисе. Единственное, что я заметил, это то, что вы устанавливаете терминатор записи, не зная, действительно ли это то, что вам нужно делать, в зависимости от среды или нет. Мне никогда не приходилось делать это, переключаясь между Linux, Windows и Solaris.

Также, одна подсказка, это вернет набор результатов, который скажет вам, сколько строк было загружено. Сделать fetchone() и распечатай, и ты увидишь.

Единственное, что я могу порекомендовать, - это использовать таблицы отклонения в случае отклонения любых строк.

Вы упомянули, что это большая работа. Возможно, вам придется увеличить время ожидания чтения, добавив 'read_timeout': 7200, к вашей связи или больше. Я не уверен, отключит ли None тайм-аут чтения или нет.

Что касается более быстрого способа... если файл доступен непосредственно на самом узле vertica, вы можете просто ссылаться на файл непосредственно в копии, а не делать copy from stdin и пусть демон загрузит его напрямую. Это намного быстрее и имеет ряд оптимизаций, которые вы можете сделать. Затем вы можете использовать пропорциональную загрузку, и если у вас есть несколько файлов для загрузки, вы можете просто сослаться на них все вместе в списке файлов.

Это довольно длинная тема. Если у вас есть конкретные вопросы, дайте мне знать.

Другие вопросы по тегам