将数据从Amazon redshift卸载到Amazon s3

时间:2018-09-02 15:21:55

标签: sql amazon-web-services amazon-s3 amazon-redshift

我正在尝试使用以下代码将数据卸载到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格式转储文件。

2 个答案:

答案 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()
    }
  }