2016-12-01 189 views
1

我試圖從postgres遷移/複製數據到使用python3 vertica(如果還有其他用戶友好的方式,我會很高興聽到他們)。問題是,下面的代碼只有在我從postgres複製一列數據時才起作用。如果我複製多個列,它將不會遷移任何內容。在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的默認分隔符是一個管道。您可能需要在Vertica副本上指定DELIMITER E'\t',或在postgresql上指定DELIMITER '|'

由於列數不足,最有可能數據被拒絕。

1

將Postgres數據庫複製到Vertica的另一種方法是使用pg_dump。這將創建一個帶有製表符分隔的文本數據文件和一個可在Vertica中編輯和執行的SQL程序的tar。

如果需要創建許多表格,這可能很有用。 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 

複製壓縮包到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