我使用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/