1、安装gohbase包
go get github.com/tsuna/gohbase
2、连接数据库
package main
import (
"context"
"encoding/json"
"fmt"
"github.com/tsuna/gohbase"
"github.com/tsuna/gohbase/hrpc"
)
hbase_client := gohbase.NewClient("hbase服务器地址") // 只有ip,没有port。
3、根据rowkey查询一条记录
返回的json数据解析为可用的结构体数据
func mian(){
getRequest, err := hrpc.NewGetStr(context.Background(), "表名", "row_key")
getRsp, err := hbase_client.Get(getRequest) // Get()方法返回查询结果。通过客户端真正读取数据
if err !=nil{
fmt.Println(err.Error())
}
type mystruct struct{
Use string `json:"user_id" `
Movies map[string][]float64 `json:"movies" ` // 用户看的多部电影 "电影id":[打分int,喜好程度float]
}
for _, v := range getRsp.Cells { // v结构体中的Value保存了真正的数据
value := v.Value
fmt.Println(string(value))
var myuser user
err:= json.Unmarshal(value, &myuser) // value为 []unit8类型的字节数组,所以可以直接放到json.Unmarshal
if err !=nil{
fmt.Println(err.Error())
}
fmt.Println(myuser)
}
4、条件查询
查询指定前缀的rowkey
package main
import (
"context"
"fmt"
"github.com/tsuna/gohbase"
"github.com/tsuna/gohbase/filter"
"github.com/tsuna/gohbase/hrpc"
"io"
"log"
)
func main() {
client := gohbase.NewClient("127.0.0.1")
var hf []func(hrpc.Call) error
// 只查询固定的列{cf: [col1, col2]}
Families :=make(map[string][]string)
temp :=[]string{"name","age"}
Families["f1"] = temp
hf = append(hf, hrpc.Families(Families))
// f 设定过滤配置
var f filter.Filter
// 条件1:限制返回条数
f = filter.NewPageFilter(100)
hf = append(hf, hrpc.Filters(f))
// 条件2:前缀过滤
var str string = "003"
//var data []byte = []byte(str)
f = filter.NewPrefixFilter([]byte(str))
hf = append(hf, hrpc.Filters(f))
getRequest, err := hrpc.NewScanStr(context.Background(), "表名", hf...)
if err != nil {
fmt.Println(err.Error())
}
scan := client.Scan(getRequest)
fmt.Println(scan)
var res []*hrpc.Result
for {
getRsp, err := scan.Next()
if err == io.EOF || getRsp == nil {
break
}
if err != nil {
log.Print(err)
}
res = append(res, getRsp)
}
fmt.Println(res)
}
只要不是指定row,就需要使用Scan