hive-cdh5.7以后版本,程序使用hive接口进行查询,如何获取查询日志?

五哥 2017-07-14 05:10:28
hive CHD 5.7版本前使用:
public String getQueryLog(TOperationHandle tOperationHandle) throws Exception {
//TCLIService.Client client;
if(tOperationHandle!=null){
TGetLogReq tGetLogReq = new TGetLogReq(tOperationHandle);
TGetLogResp logResp = client.GetLog(tGetLogReq);
log = logResp.getLog();
}

return log;
}
使用hive-service-0.12.0-cdh5.01.jar中的类
但是CDH5.7后,hive-service中的TCLIService.Client 中不在提供GetLog方法了,不知道有什么办法可以获取吗 ?
我查看了hive-exec-1.1.0-cdh5.12.0-core.jar中,org.apache.hive.service.cli.thrift;-ThriftCLIService
/**
*
* @param client
* 连接thriftserver的客户端
* @param operationHandle
* 当前操作对应句柄
* @param Orientation
* 获取结果的起始位置 FetchOrientation.First 从结果第一行开始取2
* @param fetchType
* 获取结果的类型 FetchType.LOG 获取此操作对应日志
* @param maxRows
* 此次获取的最大行数
* @return
*/
public static TRowSet fetchResult(TCLIService.Client client, TOperationHandle operationHandle,
FetchOrientation Orientation, FetchType fetchType, long maxRows) {

TFetchResultsReq fetchReq = new TFetchResultsReq();
fetchReq.setFetchType(fetchType.toTFetchType());
fetchReq.setMaxRows(maxRows);
fetchReq.setOperationHandle(operationHandle);
fetchReq.setOrientation(Orientation.toTFetchOrientation());
TRowSet rowSetLog = null;
try {
rowSetLog = client.FetchResults(fetchReq).getResults();
} catch (TException e) {
log.info("Exception:" + e.getStackTrace());
e.printStackTrace();
}
return rowSetLog;
}

好像可以,不知道有没有哪位大神,有弄过过的,分享一下,谢谢
...全文
687 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
大佬求帮助啊
Victor_python 2019-05-27
  • 打赏
  • 举报
回复
mark
五哥 2018-07-25
  • 打赏
  • 举报
回复
收掉,搞定,以下是方法,希望能给遇到人提供点点帮助,感谢CDH 社区的提醒

//获取查询日志 hive.version:cdh5.4.0后, 使用此方法获取查询日志
@Override
public String getQueryLog(TOperationHandle tOperationHandle) throws Exception {
String log = "";
if(tOperationHandle != null){

StringBuffer sbLog = new StringBuffer() ;
TFetchResultsReq fetchReq = new TFetchResultsReq(tOperationHandle, TFetchOrientation.FETCH_NEXT, 100 );
fetchReq.setFetchType((short) 1); //这一句才是重点
TFetchResultsResp resp = client.FetchResults(fetchReq);
TRowSet rs = resp.getResults() ;

if (null != rs ){
RowSet rowSet = RowSetFactory.create(rs,TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V7);
for (Object[] row : rowSet) {
sbLog.append(String.valueOf(row[0])).append("\n") ;
}
}
log = sbLog.toString() ;
}

return log;
}
五哥 2018-07-12
  • 打赏
  • 举报
回复
Please see TCLIService.FetchResults for equivalent functionality.

To retrieve operation logs, in TFetchResultsReq specify fetchType as 1.


在CDH的官网论坛上有个大哥回答的,但是我测试了,得到的结果还是不对,GetRows()是[] , 而GetColumns()是结果集


TFetchResultsReq fetchReq = new TFetchResultsReq();
fetchReq.setOperationHandle(tOperationHandle);
fetchReq.setOrientation(TFetchOrientation.FETCH_FIRST);
fetchReq.setFetchType((short) 1);
fetchReq.setMaxRows(1000);
TFetchResultsResp re = client.FetchResults(fetchReq);
System.out.println(re.getResults().getRows()) ;
/* System.out.println(status.getErrorMessage());
System.out.println(status.getSqlState());
System.out.println(status.getInfoMessages());*/
List<TColumn> list = re.getResults().getColumns();
List<Object> list_row = new ArrayList<Object>();
五哥 2018-07-06
  • 打赏
  • 举报
回复
没人遇到过吗 ?

20,808

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧