如何使用golang连接到配置单元

时间:2014-09-23 08:54:54

标签: go hive

我使用https://github.com/apache/hive/blob/trunk/service/if/TCLIService.thrift来生成golang sdk,但它不起作用。 golang sdk只能开放。我在python sdk中比较我的代码,但没有发现任何错误用法。下面是我的golang代码。

socket, err := thrift.NewTSocket("localhost:11000")
if err != nil {
    fmt.Printf("%s\n", err)
    return
}
trans := thrift.NewTBufferedTransport(socket, 1024)

protocol := thrift.NewTBinaryProtocol(trans, true, true)
client := hive.NewTCLIServiceClientProtocol(trans, protocol, protocol)
trans.Open()
defer trans.Close()

sReq := hive.NewTOpenSessionReq()
sReq.ClientProtocol = 0

session, err := client.OpenSession(sReq)
fmt.Printf("!%#v %s\n", session, err)

exeReq := hive.NewTExecuteStatementReq()
exeReq.SessionHandle = session.SessionHandle
exeReq.Statement = "USE default"

result, err := client.ExecuteStatement(exeReq)
fmt.Printf("result: %s !! %s\n", result, err)

,输出为:

!&hive.TOpenSessionResp{Status:(*hive.TStatus)(0xc21001e460), ServerProtocolVersion:0, SessionHandle:(*hive.TSessionHandle)(0xc2100002b0), Configuration:map[string]string{}} %!s(<nil>)

result: <nil> !! Required field 'guid' is unset! Struct:THandleIdentifier(guid:null, secret:null)

必填字段'guid'未设置! Struct:THandleIdentifier(guid:null,secret:null)由服务器返回。我已经尝试了其他的hive函数,总是出现同样的错误。

我的代码有什么问题或者thirft还不支持golang吗?

1 个答案:

答案 0 :(得分:0)

我找到了原因。在thrift生成的文件ttypes.go中,THandleIdentifier struct使用二进制协议编写guid和secret,我发现官方Python SDK编写guid并分配使用WriteString二进制协议函数,所以我修改代码手册。

func (p *THandleIdentifier) writeField1(oprot thrift.TProtocol) (err error) {
if p.Guid != nil {

    // the origin code is:
    //if err := oprot.WriteFieldBegin("guid", thrift.BINARY, 1); err != nil {

    if err := oprot.WriteFieldBegin("guid", thrift.STRING, 1); err != nil {
        return fmt.Errorf("%T write field begin error 1:guid: %s", p, err)
    }

    //the origin code is:
    //if err := oprot.WriteString(p.Guid; err != nil {
    if err := oprot.WriteString(string(p.Guid); err != nil {
        return fmt.Errorf("%T.guid (1) field write error: %s", p)
    }
    if err := oprot.WriteFieldEnd(); err != nil {
        return fmt.Errorf("%T write field end error 1:guid: %s", p, err)
    }
}
  return err
}

与秘密属性相同,需要修改。