我已经使用节俭为TCLIService生成了C#源代码以连接到Hiveserver2,当我将Hiveserver2与Hive版本0.13连接时,TFetchResultsResp结果始终以列的值而不是行的形式返回,即行计数始终为零。
当我尝试使用Hive版本0.12时,TFetchResultsResp结果始终以行而不是列的形式返回,即列数始终为零。
请告知我是否需要设置任何属性以在所有Hive版本中获取结果中的列和行。
TSocket transport = new TSocket("localhost", 10000);
TBinaryProtocol protocol = new TBinaryProtocol(transport);
TCLIService.Client client = new TCLIService.Client(protocol);
transport.Open();
TOpenSessionReq openReq = new TOpenSessionReq();
TOpenSessionResp openResp = client.OpenSession(openReq);
TSessionHandle sessHandle = openResp.SessionHandle;
TExecuteStatementReq execReq = new TExecuteStatementReq();
execReq.SessionHandle = sessHandle;
execReq.Statement = "show tables";
TExecuteStatementResp execResp = client.ExecuteStatement(execReq);
TOperationHandle stmtHandle = execResp.OperationHandle;
TFetchResultsReq fetchReq = new TFetchResultsReq();
fetchReq.OperationHandle = stmtHandle;
fetchReq.Orientation = TFetchOrientation.FETCH_FIRST;
fetchReq.MaxRows = 99999999;
TFetchResultsResp resultsResp = client.FetchResults(fetchReq);
TRowSet resultsSet = resultsResp.Results;
//In hive version 0.13, rows count zero
List<TRow> resultRows = resultsSet.Rows;
//In Hive version 0.12, columns count zero
List<TColumn> resultColumn = resultsSet.Columns;
TCloseOperationReq closeReq = new TCloseOperationReq();
closeReq.OperationHandle = stmtHandle;
client.CloseOperation(closeReq);
TCloseSessionReq closeConnectionReq = new TCloseSessionReq();
closeConnectionReq.SessionHandle = sessHandle;
client.CloseSession(closeConnectionReq);
transport.Close();
最佳答案
原因是以前的序列化设计(行主要)效率很低,并且导致了许多不必要的网络流量。当前的设计(专业专栏)解决了其中一些问题。
https://issues.apache.org/jira/browse/HIVE-3746
关于c# - 从不同版本的HIVE获得的TFetchResultsResp结果之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28061614/