2015-07-10 66 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