配置单元查询无法通过jdbc生成结果集

时间:2015-07-10 12:04:30

标签: java hadoop jdbc hive

我是Hive和Hadoop的新手。在我的教程中,我想创建表格为

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.DriverManager;

public class HiveCreateDb {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";

public static void main(String[] args) {
    // Register driver and create driver instance

    try {
        Class.forName(driverName);

        // get connection

        Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/mydb", "root", "");
        Statement stmt = con.createStatement();


        stmt.executeQuery("CREATE TABLE IF NOT EXISTS " + " employee ( e_id int, name String, "
                + " salary String)" + " STORED AS TEXTFILE");

        System.out.println("Operation done successfully.");

        con.close();
    } catch (ClassNotFoundException e) {
        System.err.println("class not found!!!!");
        e.printStackTrace();
    } catch (SQLException e) {
        System.err.println("sql exception!!!");
        e.printStackTrace();
    }

 }
}

当我运行代码时出现此错误

sql exception!!! java.sql.SQLException: The query did not generate a result set! at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:393)
at tr.com.vedat.hive.HiveCreateDb.main(HiveCreateDb.java:25)

所以,我找不到解决方案。任何人都可以帮助我找到错误并导致我正确的方式吗?

1 个答案:

答案 0 :(得分:9)

看起来Hive驱动程序随着时间的推移而发生变化,随着时间的推移变得更加严格。见Google Group discussion

stmt.execute()用于创建新表的查询。 executeQuery。 executeQuery()现在仅用于选择查询(DML),而执行可能用于DDL(数据定义)。

这是有道理的,因为我在其他语言中看到的大多数驱动程序(在我的情况下都是Python和C#)会将只读操作与可以实际更改数据结构的方法分开。

DDL的这个page shows the usage of executeQuery()

 ResultSet res = stmt.executeQuery("create table " + tableName + " (key int, value string)");

这里的execute示例是Python,因此您可以注意到Java示例中的所有DDL都使用executeQuery