参考网址
www.cnblogs.com/Ghose/artic…
前言
hbase是一个面向列的分布式数据库,适合需要实时随机访问超大规模数据集的场景。
hbase可以提供高并发的读取和写入的操作。
hbase的表是由key-value组成的。
下面介绍下golang关于hbase的具体操作。
本文用到的库包是:
"github.com/tsuna/gohbase"
"github.com/tsuna/gohbase/filter"
"github.com/tsuna/gohbase/hrpc"
hbase的连接
这里主要是声明客户端,然后连接hbase服务,最后得到一个客户端client
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)
}
写数据
写入数据,用的是Put()函数
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
}
更新数据
可以看到,更新数据和写入数据的代码是一样的,用的也是Put()函数。
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
}
读数据
读取数据,用的是Get()函数

查看key是否存在
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
}
}
删除数据
删除数据,用的是Delete()函数。
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())
}
res, err := client.Delete(deleteRequest)
fmt.Println(res)
if err != nil {
log4go.Error("hrpc.Scan: %s", err.Error())
}
return
}
实战
package main
import (
"fmt"
"github.com/tsuna/gohbase"
"github.com/tsuna/gohbase/hrpc"
)
func main() {
connection, err := gohbase.NewClient("localhost")
if err!= nil {
fmt.Println("连接到 HBase 时发生错误:", err)
return
}
defer connection.Close()
tableSchema := gohbase.NewTableDescriptor("myTable")
familyDescriptor := gohbase.NewColumnFamilyDescriptor("cf")
tableSchema.AddColumnFamily(familyDescriptor)
err = connection.CreateTable(tableSchema)
if err!= nil {
fmt.Println("创建表时发生错误:", err)
return
}
putRequest, err := hrpc.NewPutStr("myTable", "row1", "cf", "column1", "value1")
if err!= nil {
fmt.Println("创建 Put 请求时发生错误:", err)
return
}
_, err = connection.Put(putRequest)
if err!= nil {
fmt.Println("插入数据时发生错误:", err)
return
}
getRequest, err := hrpc.NewGetStr("myTable", "row1")
if err!= nil {
fmt.Println("创建 Get 请求时发生错误:", err)
return
}
getResponse, err := connection.Get(getRequest)
if err!= nil {
fmt.Println("获取数据时发生错误:", err)
return
}
for _, cell := range getResponse.Cells {
fmt.Printf("Cell: %s, Value: %s\n", cell.Qualifier, string(cell.Value))
}
deleteRequest, err := hrpc.NewDeleteStr("myTable", "row1")
if err!= nil {
fmt.Println("创建 Delete 请求时发生错误:", err)
return
}
_, err = connection.Delete(deleteRequest)
if err!= nil {
fmt.Println("删除数据时发生错误:", err)
return
}
}
在上述示例中,首先创建了一个与本地 HBase 实例的连接。
然后,创建了一个名为`myTable`的表,并添加了一个名为`cf`的列族。
接下来,使用`Put`方法插入了一条数据。
然后,使用`Get`方法获取了插入的数据,并打印出了每个单元格的列名和值。
最后,使用`Delete`方法删除了插入的数据。
请注意,这只是一个基本的示例,实际应用中可能需要根据具体需求进行更多的错误处理和功能扩展。
此外,确保已经正确安装和配置了 HBase,并在运行代码之前启动了 HBase 服务。