import org.apache.hadoop.hive.common.auth.HiveAuthUtils;
import org.apache.hive.jdbc.Utils.JdbcConnectionParams;
import org.apache.hive.service.auth.PlainSaslHelper;
import org.apache.hive.service.rpc.thrift.*;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TTransport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.security.auth.Subject;
import javax.security.sasl.SaslException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
/**
* HiveConnection.
*
*/
public class HiveXConn {
public static final Logger LOG = LoggerFactory.getLogger(HiveXConn.class.getName());
private String jdbcUriString;
private String host;
private int port;
private JdbcConnectionParams connParams;
private TTransport transport;
// TODO should be replaced by CliServiceClient
private TCLIService.Iface client;
private TSessionHandle sessHandle = null;
private int loginTimeout = 0;
private TProtocolVersion protocol;
private int fetchSize = 1000;
public HiveXConn(String uri, Properties info) throws Exception {
// JDBC URL: jdbc:hive2://<host>:<port>/dbName;sess_var_list?hive_conf_list#hive_var_list
// each list: <key1>=<val1>;<key2>=<val2> and so on
// sess_var_list -> sessConfMap
// hive_conf_list -> hiveConfMap
// hive_var_list -> hiveVarMap
host = "192.168.11.9";
port = 10000;
// open the client transport
openTransport();
// set up the client
client = new TCLIService.Client(new TBinaryProtocol(transport));
// open client session
openSession();
client = newSynchronizedClient(client);
}
public static TCLIService.Iface newSynchronizedClient(
TCLIService.Iface client) {
return (TCLIService.Iface) Proxy.newProxyInstance(
org.apache.hive.jdbc.HiveConnection.class.getClassLoader(),
new Class [] { TCLIService.Iface.class },
new SynchronizedHandler(client));
}
private void openTransport() throws Exception {
transport = createBinaryTransport();
if (!transport.isOpen()) {
transport.open();
}
}
// https://github.com/ds112/hbase-on-windows/blob/77e5f31715f3b4a258f212b242cd698ad983af60/Samples/Java/Hive/ThriftAPI/src/main/java/Client.java
private TTransport createBinaryTransport() throws SaslException {
// we are using PLAIN Sasl connection with user/password
String userName = "hive";
String passwd = "hive";
TTransport socketTransport = HiveAuthUtils.getSocketTransport(host, port, loginTimeout);
transport = PlainSaslHelper.getPlainTransport(userName, passwd, socketTransport);
return transport;
}
private void openSession() throws SQLException {
TOpenSessionReq openReq = new TOpenSessionReq();
Map<String, String> openConf = new HashMap<String, String>();
openConf.put("use:database", "default");
// set the fetchSize
openConf.put("set:hiveconf:hive.server2.thrift.resultset.default.fetch.size",
Integer.toString(fetchSize));
openReq.setConfiguration(openConf);
try {
TOpenSessionResp openResp = client.OpenSession(openReq);
protocol = openResp.getServerProtocolVersion();
sessHandle = openResp.getSessionHandle();
TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, "SELECT * FROM test limit 10");
// TExecuteStatementReq execReq = new TExecuteStatementReq(sessHandle, "show tables");
TExecuteStatementResp execResp = client.ExecuteStatement(execReq);
TOperationHandle stmtHandle = execResp.getOperationHandle();
TFetchResultsReq fetchReq = new TFetchResultsReq(stmtHandle, TFetchOrientation.FETCH_FIRST, 100);
TFetchResultsResp resultsResp = client.FetchResults(fetchReq);
TRowSet resultsSet = resultsResp.getResults();
List<List> tableResult = new ArrayList<List>();
if (resultsSet.getColumns() != null && resultsSet.getColumns().size() != 0)
{
List<TColumn> resultColumns = resultsSet.getColumns();
for(int i=0;i<resultColumns.size();i++ )
{
TColumn resultRow = resultColumns.get(i);
List result = new ArrayList();
if(resultRow.isSetBinaryVal() == true)
{
result = resultRow.getBinaryVal().getValues();
}
else if(resultRow.isSetBoolVal() == true)
{
result =resultRow.getBoolVal().getValues();
}
else if(resultRow.isSetByteVal() == true)
{
result =resultRow.getByteVal().getValues();
}
else if(resultRow.isSetDoubleVal() == true)
{
result=resultRow.getDoubleVal().getValues();
}
else if(resultRow.isSetI16Val() == true)
{
result =resultRow.getI16Val().getValues();
}
else if(resultRow.isSetI32Val() == true)
{
result =resultRow.getI32Val().getValues();
}
else if(resultRow.isSetI64Val() == true)
{
result =resultRow.getI64Val().getValues();
}
else if(resultRow.isSetStringVal()==true)
{
result = resultRow.getStringVal().getValues();
}
tableResult.add(result);
}
}
for(int i=0;i<tableResult.get(0).size();i++)
{
for (List list : tableResult) {
System.out.print(list.get(i).toString() + "\t");
}
System.out.println();
}
TCloseOperationReq closeReq = new TCloseOperationReq();
closeReq.setOperationHandle(stmtHandle);
client.CloseOperation(closeReq);
TCloseSessionReq closeConnectionReq = new TCloseSessionReq(sessHandle);
client.CloseSession(closeConnectionReq);
transport.close();
} catch (TException e) {
LOG.error("Error opening session", e);
throw new SQLException("Could not establish connection to "
+ jdbcUriString + ": " + e.getMessage(), " 08S01", e);
}
}
private static class SynchronizedHandler implements InvocationHandler {
private final TCLIService.Iface client;
private final ReentrantLock lock = new ReentrantLock(true);
SynchronizedHandler(TCLIService.Iface client) {
this.client = client;
}
@Override
public Object invoke(Object proxy, Method method, Object [] args)
throws Throwable {
try {
lock.lock();
return method.invoke(client, args);
} catch (InvocationTargetException e) {
// all IFace APIs throw TException
if (e.getTargetException() instanceof TException) {
throw (TException)e.getTargetException();
} else {
// should not happen
throw new TException("Error in calling method " + method.getName(),
e.getTargetException());
}
} catch (Exception e) {
throw new TException("Error in calling method " + method.getName(), e);
} finally {
lock.unlock();
}
}
}
public static void main(String[] args) throws Exception{
HiveXConn d1 = new HiveXConn("",null);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。