I am trying to insert data into hive tables from other tables in java class using hive statement instance, both, source tables and target table, are present in same hive database.
All source tables does contain data.
Following class executes the above query:
@Component
public class HiveExecutor implements IExecutor{
static final Logger logger = Logger.getLogger(HiveExecutor.class);
@Autowired
ConnectionFactory connectionFactory;
@Override
public ResultSetHolder executeSql(String sql) throws IOException {
logger.info(" Inside hive executor for SQL : " + sql);
ResultSetHolder rsHolder = new ResultSetHolder();
IConnector connector = connectionFactory.getConnector("hive");
ConnectionHolder conHolder = connector.getConnection();
Object obj = conHolder.getConObject();
if(obj instanceof Statement) {
Statement stmt = (Statement) obj;
ResultSet rs=null;
try {
if(sql.toUpperCase().contains("INSERT")) {
int result = stmt.executeUpdate(sql);
if(result != 0)
logger.info("Successfull insertion operation. Number of rows changed: "+result);
else
logger.info("Unsuccessfull insertion operation.");
}
else
rs = stmt.executeQuery(sql);
rsHolder.setResultSet(rs);
rsHolder.setType(ResultType.resultset);
} catch (SQLException e) {
e.printStackTrace();
}
}
return rsHolder;
}
@Override
public Boolean registerTempTable(DataFrame df, String tableName) {
// TODO Auto-generated method stub
return null;
}
}
When executed a SELECT query it does bring data but it fails/returns 0 for insert query.
When executed the same INSERT query from hive CLI it works as expected, inserts the data into target table.
Try to specify queue name in connection string:
CONNECTION_STRING="jdbc:hive2://host:port/db;principal=principal=hive/HiveServer2Host@YOUR-REALM.COM?mapreduce.job.queuename=prod";
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.