我正在尝试使用以下代码将数据卸载到S3存储桶中。哪个可行,但卸载后会引发一些错误。
Properties props = new Properties();
props.setProperty("user", MasterUsername);
props.setProperty("password", MasterUserPassword);
conn = DriverManager.getConnection(dbURL, props);
stmt = conn.createStatement();
String sql;
sql = "unload('select * from part where p_partkey in (select p_partkey from
part limit 10)') to"
+ " 's3://redshiftdump.****' "
+ " DELIMITER AS ','"
+ "ADDQUOTES "
+ "NULL AS ''"
+ "credentials 'aws_access_key_id=****;aws_secret_access_key=***' "
+ "parallel off" +
";";
boolean i = stmt.execute(sql);
stmt.close();
conn.close();
卸载工作。它正在存储桶中创建文件。但这给了我一些错误
java.sql.SQLException:
dataengine.impl.DSISimpleRowCountResult cannot be cast to
com.amazon.dsi.dataengine.interfaces.IResultSet
at
com.amazon.redshift.core.jdbc42.PGJDBC42Statement.createResultSet(Unknown
Source)
at com.amazon.jdbc.common.SStatement.executeQuery(Unknown Source)
此错误是什么以及如何避免它?有什么方法可以转储CSV格式的表。现在,它正在以FILE格式转储文件。
答案 0 :(得分:0)
您说UNLOAD可以工作,但是会收到此错误,这向我表明您已成功连接,但是查询完成后,代码与JDBC驱动程序交互的方式存在问题。
我们在"Connect to Your Cluster Programmatically"
页面上提供了一个示例,可能会对我们的文档有所帮助关于输出文件格式,您将获得UNLOAD SQL中指定的任何内容,但文件名将带有后缀(例如“ 000”或“ 6411_part_00”)以指示它是UNLOAD的哪一部分。
答案 1 :(得分:0)
use executeUpdate .
def runQuery(sql: String) = {
Class.forName("com.amazon.redshift.jdbc.Driver")
val connection = DriverManager.getConnection(url, username, password)
var statement: Statement = null
try {
statement = connection.createStatement()
statement.setQueryTimeout(redshiftTimeoutInSeconds)
val result = statement.executeUpdate(sql)
logger.info(s"statement response code : ${result}")
} catch {
case e: Exception => {
logger.error(s"statement.isCloseOnCompletion :${e.getMessage} ::: ${e.printStackTrace()}")
throw new IngestionException(e.getMessage)
}
}
finally {
if(statement != null ) statement.close()
connection.close()
}
}