我使用https://github.com/apache/hive/blob/trunk/service/if/TCLIService.thrift生成golang sdk,但是没有用。 Golang SDK只能进行opensession。我在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)。我尝试了其他配置单元功能,总是出现相同的错误。

我的代码有问题吗,或者渴了还不支持golang?

最佳答案

我找到了原因。在节俭生成的文件ttypes.go中,THandleIdentifier结构使用二进制协议写guid和secret,我发现官方Python SDK编写GUId和secret使用二进制协议的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
}

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

关于go - 如何使用golang连接到配置单元,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25990866/

10-16 01:27