2015-07-10 74 views
1

我是Hive和Hadoop的新手。在我的教程,我想创建表作为配置单元查询无法通过jdbc生成结果集

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) 

所以,我无法找到解决办法。任何人都可以帮助我发现错误并引导我正确的方式吗?

+2

我没有使用Java,Hive或Hadoop(因此我不能回答),但是从其他经验和Google搜索中,我会下注到需要使用stmt.execute对于使用新表而不是executeQuery的查询。 executeQuery可能用于选择查询(DML),而execute可能用于DDL。如果你想了解它们之间的差异,请看看这些。 –

+0

@PaluMacil,executeQuery和execute可以主要使用创建表或模式操作。我之前使用executeQuery来创建RDBMS,并且它工作正常。对于Hive,我发现了几个教程,并且所有这些教程都使用executeQuery进行了创建。您的评论后,我尝试执行,它的工作原理。非常感谢。我一直是教程的受害者:) – trallallalloo

+0

在这种情况下,我发布了一个答案并链接到有人说它发生变化的讨论。 –

回答

5

随着时间的推移,它看起来像Hive驱动程序随时间变化而变得更加严格。看到这个Google Group discussion

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

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

page shows the usage of executeQuery()对DDL:

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

execute这里的例子是Python的,所以你可以注意到,所有的DDL在Java示例使用executeQuery

+0

我知道DML和DDL方法的不同用法,但在这种情况下,我使用了教程中使用的DDL方法,所以它导致我错误的方式。非常感谢您的回答和研究。 – trallallalloo