java - Hive 查询在 INSERT OVERWRITE 上失败

标签 java jdbc hive

我正在使用 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

主要问题是这些查询可以从 hive 控制台成功执行。

如果我在这里遗漏了什么,请帮助任何人。或者有更好的方法来使用 jdbc 实现此目的?

注意- 上述 block 中的每个查询都是单独执行的,不带分号。我只是为了便于阅读而放置它们。

最佳答案

嗨,我尝试了您的示例案例,它有效,在执行 JDBC 客户端查询时可以像这样使用:

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:问题仍然存在意味着让我知道,将分享完整的代码。

关于java - Hive 查询在 INSERT OVERWRITE 上失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23809242/

相关文章:

Java 文本属性文件 : is there any way to test validity?

java - Selenium 拖放到不可见的位置

java - 存储库中缺少依赖项(错误 404)

java - 如何从 java.sql.Connection 获取数据库 url?

csv - 使用DBeaver,当尝试将数据从CSV导出到我的Hive数据库时,导出卡住吗?

java - 是否可以定义一个与其实现分离的 jax-rs 服务接口(interface)(使用 eclipse 和 jersey)?

java - HikariCP - 将属性添加到 JDBC url

java - 在 java 中使用 jtds 时找不到类错误

sql - 如何使用rank函数获取hive中的最新记录

hadoop - 如何使 hive 返回行更快? (例如,限制10)