【问题标题】:Athena throws Simba JDBC 11300 with ALTER TABLE ADD PARTITIONAthena 使用 ALTER TABLE ADD PARTITION 抛出 Simba JDBC 11300
【发布时间】:2019-10-03 12:14:57
【问题描述】:

使用 Athena JDBC 驱动程序运行 ALTER TABLE ADD PARTITION 会引发难以理解的异常,代码如下:

package none;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class test {

    public static void main(String[] args) throws Exception {
        Properties info = new Properties();

        info.put("User","myUser");
        info.put("Password","myPass");
        info.put("S3OutputLocation", "s3://my-bucket/output");

        Class.forName("com.simba.athena.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:awsathena://AwsRegion=us-east-1;",info);

        Statement statement = connection.createStatement();
        ResultSet queryResults = statement.executeQuery("ALTER TABLE test01 ADD PARTITION (col2 = 'b') LOCATION 's3://my-bucket/col2=b/'");             
    }

}

这是上面代码抛出的错误,请注意,如果我从错误消息中复制粘贴,查询在 Athena 控制台中运行正常

Exception in thread "main" java.sql.SQLDataException: [Simba][JDBC](11300) A ResultSet was expected but not generated from query "ALTER TABLE test01 ADD PARTITION (col2 = 'b') LOCATION 's3://my-bucket/col2=b/'". Query not executed. 
    at com.simba.athena.exceptions.ExceptionConverter.toSQLException(Unknown Source)
    at com.simba.athena.jdbc.common.SStatement.checkCondition(Unknown Source)
    at com.simba.athena.jdbc.common.SStatement.executeNoParams(Unknown Source)
    at com.simba.athena.jdbc.common.SStatement.executeNoParams(Unknown Source)
    at com.simba.athena.jdbc.common.SStatement.executeQuery(Unknown Source)
    at none.test.main(test.java:22)

但是,如果我用简单的 SELECT 替换该语句,它就可以正常工作:

//this works fine
ResultSet queryResults = statement.executeQuery("SELECT * FROM test01");
queryResults.next();
System.out.println(queryResults.getString("col1") + " -> " + queryResults.getString("col2"));

这是表定义:

CREATE EXTERNAL TABLE test01 (
  `col1` string
) PARTITIONED BY (
  col2 string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = ',',
  'field.delim' = ','
) LOCATION 's3://my-bucket/'
TBLPROPERTIES ('has_encrypted_data'='false');

使用的驱动程序版本是 Athena 文档中提供的版本:https://s3.amazonaws.com/athena-downloads/drivers/JDBC/SimbaAthenaJDBC_2.0.9/AthenaJDBC42_2.0.9.jar

关于如何解决这个问题的任何想法?谢谢!

【问题讨论】:

    标签: jdbc amazon-athena


    【解决方案1】:

    您似乎在使用statement.executeQuery(...) 执行不是查询的 SQL 语句。

    尝试改用statement.execute(...)

        statement.execute("ALTER TABLE test01 ADD PARTITION (col2 = 'b') LOCATION 's3://my-bucket/col2=b/'");             
    

    【讨论】:

    • 大错特错!我被使用 executeQuery 进行 CREATE 的示例误导了,并且没有产生有用的错误消息,但是 execute() 是要走的路,谢谢。
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2021-12-21
    • 2020-02-04
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多