impala版本:1.1.1
hive版本:0.10
最近在使用JDBC执行impala sql的时候遇到一个问题,使用JDBC执行insert overwrite/into table...select...语句的时候,执行的结果显示是成功,但是查看表中的数据的时候,发现数据并没有插入到目标表中。通过查看http://impala-node-hostname:25000/queries 发现刚才执行的SQL的状态是Exception.说明确实执行失败。
出现这种情况的原因是由于hive驱动的bug造成的,因为sessions在执行的时候,impala将取消正在运行的查询。现在hive 0.10以及 0.11的驱动都存在这样的问题,估计能在0.12的版本中解决这个问题。
解决方案: 我们到/hive/src/jdbc/src/java/org/apache/hive/jdbc这个目录下找到HiveStatement.java这个文件,在这个类中有个execute方法,我们提交的SQL就是通过这个方法来执行的,它的代码如下:
public boolean execute(String sql) throws SQLException {
if (isClosed) {
throw new SQLException("Can't execute after statement has been closed");
}
try {
closeClientOperation();
TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, sql);
execReq.setConfOverlay(sessConf);
TExecuteStatementResp execResp = client.ExecuteStatement(execReq);
if (execResp.getStatus().getStatusCode().equals(TStatusCode.STILL_EXECUTING_STATUS)) {
warningChain = Utils.addWarning(warningChain, new SQLWarning("Query execuing asynchronously"));
} else {
Utils.verifySuccessWithInfo(execResp.getStatus());
}
stmtHandle = execResp.getOperationHandle();
} catch (SQLException eS) {
throw eS;
} catch (Exception ex) {
throw new SQLException(ex.toString(), "08S01", ex);
}
if (!stmtHandle.isHasResultSet()) {
return false;
}
resultSet = new HiveQueryResultSet.Builder().setClient(client).setSessionHandle(sessHandle)
.setStmtHandle(stmtHandle).setMaxRows(maxRows).setFetchSize(fetchSize)
.setScrollable(isScrollableResultset)
.build();
return true;
}
修改上述代码的
if (!stmtHandle.isHasResultSet()) {
return false;
}
部分,修改后的代码如下:
public boolean execute(String sql) throws SQLException {
if (isClosed) {
throw new SQLException("Can't execute after statement has been closed");
}
try {
closeClientOperation();
TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, sql);
execReq.setConfOverlay(sessConf);
TExecuteStatementResp execResp = client.ExecuteStatement(execReq);
if (execResp.getStatus().getStatusCode().equals(TStatusCode.STILL_EXECUTING_STATUS)) {
warningChain = Utils.addWarning(warningChain, new SQLWarning("Query execuing asynchronously"));
} else {
Utils.verifySuccessWithInfo(execResp.getStatus());
}
stmtHandle = execResp.getOperationHandle();
} catch (SQLException eS) {
throw eS;
} catch (Exception ex) {
throw new SQLException(ex.toString(), "08S01", ex);
}
if (!stmtHandle.isHasResultSet()) {
// Poll until the query has completed one way or another. DML queries will not return a result
// set, but we should not return from this method until the query has completed to avoid
// racing with possible subsequent session shutdown, or queries that depend on the results
// materialised here.
TGetOperationStatusReq statusReq = new TGetOperationStatusReq(stmtHandle);
boolean requestComplete = false;
while (!requestComplete) {
try {
TGetOperationStatusResp statusResp = client.GetOperationStatus(statusReq);
Utils.verifySuccessWithInfo(statusResp.getStatus());
if (statusResp.isSetOperationState()) {
switch (statusResp.getOperationState()) {
case CLOSED_STATE:
case FINISHED_STATE:
return false;
case CANCELED_STATE:
// 01000 -> warning
throw new SQLException("Query was cancelled", "01000");
case ERROR_STATE:
// HY000 -> general error
throw new SQLException("Query failed", "HY000");
case UKNOWN_STATE:
throw new SQLException("Unknown query", "HY000");
case INITIALIZED_STATE:
case RUNNING_STATE:
break;
}
}
} catch (Exception ex) {
throw new SQLException(ex.toString(), "08S01", ex);
}
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
// Ignore
}
}
return false;
}
resultSet = new HiveQueryResultSet.Builder().setClient(client).setSessionHandle(sessHandle)
.setStmtHandle(stmtHandle).setMaxRows(maxRows).setFetchSize(fetchSize)
.setScrollable(isScrollableResultset)
.build();
return true;
}
通过上面的修改,会一直等待查询结束。
然后,我们使用ant把hive重新编译一遍,替换掉其中的驱动包。
期望hive能在0.12版本中解决这个问题。
分享到:
相关推荐
Impala 与Hive都是构建在Hadoop之上的数据查询工具各有不同的侧重适应面,但从客户端使用来看Impala与Hive有很多的共同之处,如数据表元数 据、ODBC/JDBC驱动、SQL语法、灵活的文件格式、存储资源池等。Impala与Hive...
手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,... 5.Impala与应用系统集成JDBC 第五章:Impala原理深入 1.Impala各角色功能详解 2.Impala任务提交原理 3.Impala元数据同步原理
Java_通过_JDBC_分别采用混合验证模式和_Windows_身份验证模式连接_SQL_Server_2008_或_2005_的连接实例
Impala是基于Hive的大数据实时分析查询引擎,直接使用Hive的元数据库Metadata,意味着impala元数据都存储在Hive的metastore中。并且impala兼容Hive的sql解析,实现了Hive的SQL语义的子集,功能还在不断的完善中。...
Impala的SQL后端dplyr-源码
sqlserver2008驱动包、Oracle11g驱动包、MySqL6驱动包、DB2 10 驱动包
Phoenix查询引擎会将SQL查询转换为一个或多个HBase scan,并编排执行以生成标准的JDBC结果集。直接使用HBase API、协同处理器与自定义过滤器,对于简单查询来说,其性能量级是毫秒,对于百万级别的行数来说,其性能...
impala、hive、oracle、sqlserver、oracle、hbase、mysql数据库驱动jar包
要在命令行上使用,请执行以下操作 - $ git clone <> $ cd <> $ mvn clean package $ cat > sample.sql << EOF SELECT 1+1 EOF $ export CONNECTION_URL= " jdbc:hive2://impalad_host:impalad_port/...
1 sqltoy-orm是什么 sqltoy-orm是比hibernate+...其他数据库支持基于jdbc的sql执行(查询和自定义sql的执行) 2. 快速特点说明 2.1 对象操作跟jpa类似并有针对性加强(包括级联) 通过quickvo工具从数据库生成对应的POJO,
1、解压包2、运行3、可视化界面配置3.1 默认driver驱动信息查看驱动,默认有3个驱动可用,hive和impala,spark的jdbc驱动包和drive
AS400,DB2,Derby,Firebird,H2,HadoopHive,Impala,Mysql,Oracle,Postgresql,SQLite,SQLServer,Sybase jar包
连接数据库所需要的驱动包,有SQLSERVER,ORACLE,MYSQL
Java关系型数据库驱动大全21种关系型数据库jdbc驱动jar包 oracle、达梦(DM)、DB2、人大金仓(Kingbase)、南大通用(Gbase)、GreenPlum、Hive2、impala、Obase、openGauss、阿里云大数据(ODPS)、informix、...
oracle、达梦(DM)、DB2、人大金仓(Kingbase)、南大通用(Gbase)、GreenPlum、Hive2、impala、Obase、openGauss、阿里云大数据(ODPS)、informix、Inforbright、presto、SqlServer、sybase、teradata、优炫...
Linkis与计算/存储引擎(Spark,Hive,Python和HBase)连接,公开REST / WS接口,并执行多语言作业(SQL,Pyspark,HiveQL和Scala)作为计算中间件。 Linkis基于微服务架构,提供了企业级的多租户隔离,资源管理和...
sqli简单SQL拼写 sqli/sqli-builder sqli/sqli-core sqli/sqli-dialect sqli/sqli-repo sqli-repo 使用方法 sqli仅仅是SQL的编程接口,需要整合到已有的框架或项目中, 在io.xream.x7项目里实现了和Spring-Boot/Spring...
Java及⼤数据学习路线 1.Java学习路线 1.1JavaSE Java基础 Java8新特性 数据库MySQL与SQL语⾔ JDBC 1.2JavaWeb HTML基础与CSS JavaScript DOM 与 jQuery XML与Tomcat HTTP协议 服务器端组件Servlet JSP EL表达式 ...
通过使用由Linkis提供的REST / WS / JDBC之类的标准接口,上层应用程序可以轻松访问诸如MySQL / Spark / Hive / Presto / Flink等底层引擎,并实现用户资源(如统一变量)的互通,脚本,UDF,函数和资源文件同时...