2016-12-01 4 views
1

Я пытаюсь перенести/скопировать данные из postgres в vertica с помощью python3 (если есть и другие удобные для пользователя способы, я был бы рад их услышать). Проблема в том, что приведенный ниже код работает только при копировании столбца данных из postgres. В случае, когда я копирую более одного столбца, он переносит Nothing.i.e. созданный в таблице vertica, пуст.Миграция/копирование данных из postgres в vertica

Как перенести всю таблицу из postgres в vertica?

conn = psycopg2.connect() 

input = io.StringIO() 
cur_postrgres = conn.cursor() 
cur_postrgres.copy_expert('''COPY (SELECT id, date from table_1) TO STDOUT;''', input) 
cur_postrgres.close() 

cur_vertica.execute("DROP TABLE IF EXISTS table_1_temp;") 
cur_vertica.connection.commit() 
cur_vertica.execute('''CREATE TABLE table_1_temp (
id BIGINT, date TIMESTAMP WITHOUT TIME ZONE);''') 
cur_vertica.connection.commit() 

#cur_vertica.stdin = input 
#input.seek(0) 

cur_vertica.copy('''COPY table_1_temp FROM STDIN NULL AS 'null' ''', input.getvalue()) 
cur_vertica.execute("COMMIT;") 
cur_vertica.close() 

ответ

0

По умолчанию разделитель по умолчанию в postgresql - это вкладка, я считаю. Разделителем по умолчанию для vertica является труба. Вам может потребоваться указать DELIMITER E'\t' на копию Vertica или указать DELIMITER '|' на postgresql.

Скорее всего, данные отклоняются за отсутствие достаточного количества столбцов.

1

Другой способ скопировать базу данных Postgres в Vertica - использовать pg_dump. Это создает tar с разделителями-разделителями текстовых файлов и программой SQL, которую вы можете редактировать и выполнять в Vertica.

Это может быть полезно, если существует множество таблиц, которые необходимо создать. SQL содержит инструкции типа CREATE TABLE, ADD INDEX, CREATE SEQUENCE и т. Д. Для каждой таблицы и генерирует инструкции COPY для загрузки каждого файла данных.

Vertica основан на PostgresQL, поэтому диалекты аналогичны. Созданный генератор restore.sql почти идеален, вам просто нужно удалить операторы, которые не актуальны, возможно, изменить имя схемы и уточнить операторы COPY.

pg_dump --format=tar --dbname=mydb --username=myuser --no-owner --verbose --no-privileges > mydata.tar 

Необязательно сжать смолу перед экспортом

zip mydata.tar.zip mydata.tar 

Copy тарбалл в рабочий каталог на машине Vertica

scp -i ~/.ssh/secret.pem mydata.tar.zip mydata.tar.zip [email protected]:/data 

Войдите в экземпляр, распаковать архив:

ssh -i ~/.ssh/secret.pem [email protected]:/data 
unzip mydata.tar.zip 
tar -xvf mydata.tar 

N ow отредактируйте файл restore.sql соответствующим образом. Я обнаружил, что мне нужно, чтобы:

  • удалить кучу материала в верхней части, как SET statement_timeout = 0; и COMMENT ON EXTENSION plpgsql, который не имеет отношения к Vertica

  • удалить один из двух COPY утверждений он генерирует, один из STDIN и один из файла

  • отредактировать COPY заявление, чтобы добавить Vertica конкретные вещи, как DELIMITER AS E'\t' NULL AS '\N' ABORT ON ERROR;

После этого импорта только выполнение этого файла в Vertica:

\i restore_modified.sql