无法通过JDBC

时间:2015-10-21 18:05:54

标签: hadoop jdbc hive

我无法通过JDBC对我的hive表进行更新。我能够选择,但不能更新。

连接到配置单元数据库:

Connection connection =  
DriverManager.getConnection("jdbc:hive2://localhost:10000/db", "", "");

我的查询:

ResultSet resultSet = statement.executeQuery("update db.test set name='yo yo' where id=1");

堆栈跟踪:

java.sql.SQLException: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:275)
at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:355)
at com.spnotes.hive.App.main(App.java:63)

同样,我能够选择但不能通过JDBC更新。但是,我只能通过hive shell更新我的表。我相信这是一个用户权限问题。我已经看到了其他问题,其中HDFS目录需要在被写入之前被授予权限。

我不得不用我的HDFS用户调用我的hive shell:

sudo -u hdfs hive

我可以通过JDBC以某种方式传递“hfds”用户吗?看起来这不可能。这就是我认为异常不再发生的原因。

以下是传递用户名和密码的“安全方式”:

Connection con = DriverManager.getConnection("jdbc:hive2:/hiveserver.domain.com:10000/default;user=username;password=password");

但这与传递用户hdfs不同。也许可以将“用户名”与更新hive表的权限相关联?

欢迎任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

您正试图在executeQuery()中传递更新语句 出于安全原因,使用此方法时,任何更新语句都将失败。将其更改为executeUpdate()

此外,我建议使用准备好的语句,而不是使用这样的查询,因为通过使用参数,您可以减少对SQL注入的攻击