python连接hiveserver2_hiveserver2 python client

本文提供了一个Python连接HiveServer2的简单示例,基于Hue的代码。主要内容包括安装thrift库,将hive的thrift生成文件加入路径,并展示了如何创建和使用HiveServer2客户端进行SQL执行及结果获取。
摘要由CSDN通过智能技术生成

一个hiveserver2 python客户端的例子,大部分代码来自于hue。

忽略了一些必要的判断,只是做一个简单的例子。

需要安装thrift以及把hive-0.10.0-cdh4.3.0/src/service/src/gen/thrift/gen-py目录拷贝到项目目录中。

thrift文件在hive-0.10.0-cdh4.3.0/src/service/if/TCLIService.thrift

默认需要通过sasl客户端,前端的表现是连接了没反应,后端hiveserver2有错误日志

java.lang.RuntimeException: org.apache.thrift.transport.TTransportException

at org.apache.thrift.transport.TSaslServerTransport$Factory.getTransport(TSaslServerTransport.java:219)

如果不用sasl客户端,可以设置参数(参考stackoverflow)

hive.server2.authenticationNOSASL

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys

import os

cur_dir = os.path.dirname(os.path.abspath(__file__))

sys.path.append(os.path.join(cur_dir, "gen-py"))

from TCLIService import TCLIService

from TCLIService.ttypes import TOpenSessionReq, TGetTablesReq, TFetchResultsReq,\

TStatusCode, TGetResultSetMetadataReq, TGetColumnsReq, TType,\

TExecuteStatementReq, TGetOperationStatusReq, TFetchOrientation,\

TCloseSessionReq, TGetSchemasReq, TGetLogReq, TCancelOperationReq

from thrift import Thrift

from thrift.transport import TSocket

from thrift.transport import TTransport

from thrift.protocol import TBinaryProtocol

class HiveServerTColumnValue:

def __init__(self, tcolumn_value):

self.column_value = tcolumn_value

@property

def val(self):

# TODO get index from schema

if self.column_value.boolVal is not None:

return self.column_value.boolVal.value

elif self.column_value.byteVal is not None:

return self.column_value.byteVal.value

elif self.column_value.i16Val is not None:

return self.column_value.i16Val.value

elif self.column_value.i32Val is not None:

return self.column_value.i32Val.value

elif self.column_value.i64Val is not None:

return self.column_value.i64Val.value

elif self.column_value.doubleVal is not None:

return self.column_value.doubleVal.value

elif self.column_value.stringVal is not None:

return self.column_value.stringVal.value

class HiveServerClient(object):

user = 'fatkun'

session_handle = None

def connect(self):

transport = TSocket.TSocket('localhost', 10000)

transport = TTransport.TBufferedTransport(transport)

protocol = TBinaryProtocol.TBinaryProtocol(transport)

client = TCLIService.Client(protocol)

transport.open()

self._client = client

def open_session(self, username):

req = TOpenSessionReq(username=username, configuration={})

res = self._client.OpenSession(req)

session_handle = res.sessionHandle

print res

return session_handle

def call(self, fn, req, status=TStatusCode.SUCCESS_STATUS):

if self.session_handle is None:

self.session_handle = self.open_session(self.user)

if hasattr(req, 'sessionHandle') and req.sessionHandle is None:

req.sessionHandle = self.session_handle

res = fn(req)

return res

def execute_statement(self, statement, max_rows=100):

req = TExecuteStatementReq(statement=statement, confOverlay={})

res = self.call(self._client.ExecuteStatement, req)

return self.fetch_result(res.operationHandle, max_rows=max_rows)

def fetch_result(self, operation_handle, orientation=TFetchOrientation.FETCH_NEXT, max_rows=100):

fetch_req = TFetchResultsReq(operationHandle=operation_handle, orientation=orientation, maxRows=max_rows)

res = self.call(self._client.FetchResults, fetch_req)

if operation_handle.hasResultSet:

meta_req = TGetResultSetMetadataReq(operationHandle=operation_handle)

schema = self.call(self._client.GetResultSetMetadata, meta_req)

else:

schema = None

return res, schema

def main():

client = HiveServerClient()

client.connect()

client.execute_statement(statement='SET hive.server2.blocking.query=true')

statement = 'select name from test'

res, schema = client.execute_statement(statement)

for row in res.results.rows:

for column in row.colVals:

print HiveServerTColumnValue(column).val

if __name__ == '__main__':

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值