使用 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 是其中之一:

从 Amazon S3 复制 从 Amazon EMR 复制 从远程主机 (SSH) 复制 从 Amazon DynamoDB 复制

将数据复制到 Redshift 的最有效方法是将其放在 Amazon S3 中,然后使用 COPY 命令。这会在所有节点上执行并行加载并支持 GZIP 格式(减少文件存储并加快加载速度)。

【讨论】:

以上是关于使用 java 程序从 STDIN 复制 Redshift的主要内容,如果未能解决你的问题,请参考以下文章

c语言编程中字符串复制函数编程程序出现错误,这是怎么回事?

Amazon Redshift - 复制 - 数据加载与查询性能问题

C++:使用程序集询问用户输入而不按回车? [复制]

从文件或 STDIN 读取

如何从 subprocess.Popen 使用 STDIN [重复]

fflush(stdin) 在 C 编程中有啥作用? [复制]