将数据从postgres迁移/复制到vertica

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将数据从postgres迁移/复制到vertica相关的知识,希望对你有一定的参考价值。

我正在尝试使用python3将数据从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()
答案

我相信postgresql副本中的默认分隔符是一个选项卡。 vertica的默认分隔符是管道。您可能需要在vertica副本上指定DELIMITER E' ',或在postgresql上指定DELIMITER '|'

由于没有足够的列,数据很可能会被拒绝。

另一答案

将Postgres数据库复制到Vertica的另一种方法是使用pg_dump。这将创建一个带有制表符分隔的文本数据文件的tar和一个可以在Vertica中编辑和执行的SQL程序。

如果需要创建许多表,这可能很有用。 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

可选择在导出前压缩tar

zip mydata.tar.zip mydata.tar

将tarball复制到Vertica计算机上的工作目录

scp -i ~/.ssh/secret.pem mydata.tar.zip  mydata.tar.zip  myuser@123.456.345:/data

登录实例,解压缩tarball:

 ssh -i ~/.ssh/secret.pem myuser@123.456.345:/data
 unzip mydata.tar.zip
 tar -xvf mydata.tar

现在适当地编辑restore.sql文件。我发现我需要:

  • 删除顶部的一堆东西,如SET statement_timeout = 0;COMMENT ON EXTENSION plpgsql,与Vertica无关
  • 删除它生成的两个COPY语句之一,一个来自STDIN,另一个来自文件
  • 编辑COPY语句以添加像DELIMITER AS E' ' NULL AS 'N' ABORT ON ERROR;这样的特定于vertica的内容

之后,导入只是在Vertica中执行该文件:

i restore_modified.sql

以上是关于将数据从postgres迁移/复制到vertica的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 在 SQL Server BCP 文件的最后一个预期列之后复制错误额外数据

使用 pg_dump 将 Postgres 从 Windows 迁移到 Linux 时如何选择正确的排序规则来创建数据库?

从 postgres 迁移到 oracle (Ansi) 中的奇怪字符

如何在 vertica 中获取最后发布的序列 ID?

使用 Node.js 从 Redshift 将数据复制到 postgres

将数据库从 Heroku 迁移到 AWS