HBase是一個面向列的分布式數(shù)據(jù)庫,適合一些需要實時隨機地訪問超大規(guī)模數(shù)據(jù)集的場合瓦盛,hbase可以提供高并發(fā)讀寫操作的支持喉悴。表是由Key-Value組成的,下面主要介紹一下golang下hbase的一些基本操作禀晓。本文用到的庫主要有:
“github.com/tsuna/gohbase”
“github.com/tsuna/gohbase/filter”
“github.com/tsuna/gohbase/hrpc”
1精续、Hbase的連接
var client gohbase.Client
func ConnectHBase() {
???? hbaseUrl := beego.AppConfig.String("hbaseHost")
???? user := beego.AppConfig.String("userName")
???? option := gohbase.EffectiveUser(user)
???? client = gohbase.NewClient(hbaseUrl, option)
}
2,向表中添加數(shù)據(jù)
func PutsByRowkey(table, rowKey string, values map[string]map[string][]byte) (err error) {
???? putRequest, err := hrpc.NewPutStr(context.Background(), table, rowKey, values)
???? if err != nil {
???????? log4go.Error("hrpc.NewPutStr: %s", err.Error())
???? }
???? _, err = client.Put(putRequest)
???? if err != nil {
???????? log4go.Error("hbase clients: %s", err.Error())
???? }
???? return
}
例如在hbase中建表hbase_table
hbase(main):041:0> create 'hbase_table',? {NAME=>'CF1'}, {NAME=>'CF2'}
此表此表中Key為NAME粹懒,有兩個列族CF1和CF2重付,其中CF1和CF2下分別有兩個列name和gender,Chinese和Math
values := map[string]map[string][]byte{
"CF1": map[string][]byte{
"name": []byte("TigerwolfC"),
"gender":[]byte("man")},
"CF2": map[string][]byte{
"Chinese":? []byte("99"),
"Math": []byte("100")}}
PutsByRowkey(table, rowkey, values)
3凫乖,更新表中數(shù)據(jù)
func UpdataHbase(table, rowKey string, values map[string]map[string][]byte) (err error) {
???? putRequest, err := hrpc.NewPutStr(context.Background(), table, rowKey, values)
???? if err != nil {
???????? log4go.Error("hrpc.NewPutStr: %s", err.Error())
???? }
???? res, err := client.Put(putRequest)
???? fmt.Println(res)
???? if err != nil {
???????? log4go.Error("hbase clients: %s", err.Error())
???? }
???? return
}
4确垫、查看數(shù)據(jù)
func Gets(table, rowKey string) (*hrpc.Result, error) {
???? getRequest, err := hrpc.NewGetStr(context.Background(), table, rowKey)
???? if err != nil {
???????? log4go.Error("hrpc.NewGetStr: %s", err.Error())
???? }
???? res, err := client.Get(getRequest)
???? if err != nil {
???????? log4go.Error("hbase clients: %s", err.Error())
???? }
???? defer func() {
???? if errs := recover(); errs != nil {
???????? switch fmt.Sprintf("%v", errs) {
???????????? case "runtime error: index out of range":
???????????????? err = errors.New("NoSuchRowKeyOrQualifierException")
??????????? case "runtime error: invalid memory address or nil pointer dereference":
?????????????? err = errors.New("NoSuchColFamilyException")
?????????? default:
????????????? err = fmt.Errorf("%v", errs)
???????? }
???? }
}()
return res, nil
}
5弓颈、查看rowkey是否存在
func IsExistRowkey(table, rowKey string) bool {
???? getRequest, err := hrpc.NewGetStr(context.Background(), table, rowKey)
???? if err != nil {
???????? log4go.Error("hrpc.NewGetStr: %s", err.Error())
???? }
???? res, err := client.Get(getRequest)
???? if err != nil {
???????? log4go.Error("get from hbase: %s", err.Error())
???? }
???? if len(res.Cells) > 0 {
???????? return true
???? } else {
???????? return false
???? }
}
6,刪除數(shù)據(jù)
func DeleteByRowkey(table, rowkey string, value map[string]map[string][]byte) (err error) {
???? deleteRequest, err := hrpc.NewDelStr(context.Background(), table, rowkey, value)
???? if err != nil {
???????? log4go.Error("hrpc.NewDelStrRef: %s", err.Error())
???? }
??? //fmt.Println("deleteRequest:", deleteRequest)
???? res, err := client.Delete(deleteRequest)
???? fmt.Println(res)
??? if err != nil {
???????? log4go.Error("hrpc.Scan: %s", err.Error())
???? }
???? return
}
按照rowkey刪除整條記錄可以如下操作
DeleteByRowkey(table, rowkey, nil)
如有不對歡迎指正删掀,相互學習翔冀,共同進步。