首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >thrift2无效

thrift2无效
EN

Stack Overflow用户
提问于 2017-02-28 08:24:31
回答 1查看 752关注 0票数 0

我正在编写一个python脚本来从hbase加载数据。但是,在thrift生成的文件中,事情似乎出了问题。这是我的代码:

代码语言:javascript
复制
def create_hbase_connection():
    thrift_socket = TSocket.TSocket(thrift_server, thrift_port)
    thrift_socket.setTimeout(thrift_timeout)
    thrift_transport = TTransport.TFramedTransport(thrift_socket)
    thrift_protocol = TBinaryProtocol.TBinaryProtocolAccelerated(thrift_transport)
    thrift_client = THBaseService.Client(thrift_protocol)
    try:
        thrift_transport.open()
    except Exception as e:
        print "connect to hbase thrift failed. (%s)" % e
        sys.exit()

    return thrift_protocol, thrift_client

def fetch_rows_from_hbase(thrift_protocol, thrift_client, start_row = None):
    tscan = ttypes.TScan()
    if start_row != None:
        tscan.startRow = start_row
    tscan.maxVersions = max_versions
    tscan.filterString = "FamilyFilter(!=, 'binary:ge')"
    scan_id = thrift_client.openScanner(hbase_table_name, tscan)
    result = thrift_client.getScannerRows(scan_id, row_limits + 1)
    print result
    print "=================================================\n"
    thrift_client.closeScanner(scan_id)
    thrift_protocol.close()

if __name__ == '__main__':
    thrift_protocol, thrift_client = create_hbase_connection()
    fetch_rows_from_hbase(thrift_protocol, thrift_client)

这是一个错误:

回溯(最近一次调用):File "./load_hbase.py",第46行,在fetch_rows_from_hbase(thrift_protocol,thrift_client) File“./load_hbase.py”中,第37行,在fetch_rows_from_hbase scan_id = thrift_client.openScanner(hbase_table_name,tscan)文件中,第715行,在"/home/lishaohua/kpn/load_hbase/thrift2/hbase/THBaseService.py",返回self.recv_openScanner()文件的第735行中,在recv_openScanner result.read(iprot)文件的第3278行中,在read fastbinary.decode_binary(self,iprot.trans,(self.class,self.thrift_spec)AttributeError中:'TFramedTransport‘对象没有属性'trans’。

我在TTransport.py中检查代码,TFramedTransport有属性self.__trans。怎么解决这个问题?我可以简单地将tans改为__trans,但是还有更多的问题。

EN

回答 1

Stack Overflow用户

发布于 2017-08-03 02:12:53

我用的是TBufferedTransport而不是TFramedTransport,它起了作用。您可以在下面尝试我的解决方案:

代码语言:javascript
复制
class ThriftConn(object):
    def __init__(self, ip, port, service_cls):
        self.socket = TSocket.TSocket(ip, port)
        self.trans = TTransport.TBufferedTransport(self.socket)                                                                                                                                                   
        self.protocol = TBinaryProtocol.TBinaryProtocol(self.trans)
        self.client = service_cls.Client(self.protocol)

    def __enter__(self):
        self.trans.open()

    def __exit__(self, exception_type, exception_value, 
        exception_traceback):
        self.trans.close()

HBASE_SERVER_CLIENT = ThriftConn(ip, port, THBaseService)
with HBASE_SERVER_CLIENT:
    scan = TScan()
    scan_id = HBASE_SERVER_CLIENT.client.openScanner(table, scan)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42503579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档