簡體   English   中英

Hive查詢在INSERT OVERWRITE上失敗

[英]Hive query failing on INSERT OVERWRITE

我正在使用jdbc連接在hive(v 0.11)上運行查詢。 代碼如下:

Connection con = DriverManager.getConnection(
                "jdbc:hive://192.168.1.10:10000", "", "");
Statement stmt = con.createStatement();
stmt.execute("some query");

它成功運行以下查詢:

CREATE TABLE testdb.test(name string,id int);

SELECT * FROM testdb.test;

但是,在執行任何包含INSERT OVERWRITE子句的查詢時將失敗。 例如:

INSERT OVERWRITE DIRECTORY '/user/jim/dir' SELECT * FROM space.test;

INSERT OVERWRITE TABLE testdb.t2 select name,id from testdb.test;

具有以下跟蹤:

java.sql.SQLException: Query returned non-zero code: 1, cause: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MapRedTask
at org.apache.hadoop.hive.jdbc.HivePreparedStatement.executeImmediate(HivePreparedStatement.java:178)
at org.apache.hadoop.hive.jdbc.HivePreparedStatement.executeQuery(HivePreparedStatement.java:141)
at my.pack.test.HiveTest.main(HiveTest.java:31)
  Caused by: HiveServerException(message:Query returned non-zero code: 1, cause: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MapRedTask, errorCode:1, SQLState:08S01)
at org.apache.hadoop.hive.service.ThriftHive$execute_result$execute_resultStandardScheme.read(ThriftHive.java:1494)
at org.apache.hadoop.hive.service.ThriftHive$execute_result$execute_resultStandardScheme.read(ThriftHive.java:1480)
at org.apache.hadoop.hive.service.ThriftHive$execute_result.read(ThriftHive.java:1430)
at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
at org.apache.hadoop.hive.service.ThriftHive$Client.recv_execute(ThriftHive.java:116)
at org.apache.hadoop.hive.service.ThriftHive$Client.execute(ThriftHive.java:103)
at org.apache.hadoop.hive.jdbc.HivePreparedStatement.executeImmediate(HivePreparedStatement.java:176)
... 2 more

主要問題是可以從配置單元控制台成功執行這些查詢。

如果我在這里缺少任何東西,請幫助任何人。 還是有更好的方法用jdbc實現呢?

注意:以上塊中的每個查詢均不使用分號單獨執行。 我只是為了便於閱讀而放置它們。

嗨,我嘗試了您的示例案例,它可以正常工作,對JDBC Client執行查詢時可以這樣使用:

String sql = "INSERT OVERWRITE DIRECTORY '/user/jim/dir' select * from " + tableName;

stmt.execute(sql);

注意 :

  1. 確保/ user / jim / dir是可寫的,如果不能,則將其寫為

    hadoop fs -chmod a + rwx / user / jim / dir

  2. 使用stmt.execute(sql)而不是stmt.executeQuery(sql);

PS:問題仍然存在,請告訴我,將共享完整的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM