我使用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吗?
答案 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
}
与秘密属性相同,需要修改。