使用 java 程序从 STDIN 复制 Redshift
Posted
技术标签:
【中文标题】使用 java 程序从 STDIN 复制 Redshift【英文标题】:Redshift copy from STDIN using java program 【发布时间】:2015-07-24 06:14:25 【问题描述】:我的 Java 程序在 Postgres 上运行良好,但在迁移到 Redshift 时,我希望这个 Postgres 程序在 Redshift 上运行。
在 Postgres 中,我使用了以下课程,我正在尝试在 Redshift 中使用相同的课程。
import org.postgresql.copy.CopyIn;
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;
following is the program snapshot :
Connection insertConnection = OpenDBConnection(prop);
CopyIn cpIN = null;
CopyManager cm = new CopyManager((BaseConnection) insertConnection);
cpIN = cm.copyIn("COPY table_name (col1,col2) FROM STDIN WITH DELIMITER '|'");
but I'm getting following error:
java.lang.ClassCastException:com.amazon.redshift.jdbc41.S41NotifiedConnection 无法转换为 org.postgresql.core.BaseConnection
基本上,程序所做的是,它从 db 表中复制一些记录,放入 STDIN,proram 处理记录,过滤并复制到其他 db 表。
【问题讨论】:
这个网站不是为了卸载工作,而是帮助你解决你自己无法解决的具体问题。你必须表现出你自己的一些努力。你试过什么?它是怎么失败的? 我认为您不能将 CopyManager API 与 Redshift 修改后的 PgJDBC 一起使用。如果可以,它将使用不同的 API 或至少不同的类名。您将需要一个用于 Redshift 的类和一个用于普通 PostgreSQL 的类,然后根据连接类型决定使用哪一个。 @Craig Ringer:谢谢克雷格。 Redshift 不支持 CopyManager API。你能建议我可以为 Redshift 使用什么等价物。在我的场景中使用单独的类不起作用。 【参考方案1】:不可能使用COPY...FROM STDIN
。
Amazon Redshift COPY documentation 显示:
COPY table_name
[ column_list ]
FROM data_source
[ WITH ] CREDENTIALS [AS] 'aws_access_credentials'
[ [ FORMAT ] [ AS ] data_format ]
[ [ parameter [ argument ] [, ... ] ]
data_source
是其中之一:
将数据复制到 Redshift 的最有效方法是将其放在 Amazon S3 中,然后使用 COPY
命令。这会在所有节点上执行并行加载并支持 GZIP 格式(减少文件存储并加快加载速度)。
【讨论】:
以上是关于使用 java 程序从 STDIN 复制 Redshift的主要内容,如果未能解决你的问题,请参考以下文章
Amazon Redshift - 复制 - 数据加载与查询性能问题