'sc001','SC_Score','86'
put 'SC','sc002','SC_Sno','2015001'
put 'SC','sc002','SC_Cno','123002'
put 'SC','sc002','SC_Score','77'
put 'SC','sc003','SC_Sno','2015002'
put 'SC','sc003','SC_Cno','123002'
put 'SC','sc003','SC_Score','77'
put 'SC','sc004','SC_Sno','2015002'
put 'SC','sc004','SC_Cno','123003'
put 'SC','sc004','SC_Score','99'
put 'SC','sc005','SC_Sno','2015003'
put 'SC','sc005','SC_Cno','123001'
put 'SC','sc005','SC_Score','98'
put 'SC','sc006','SC_Sno','2015003'
put 'SC','sc006','SC_Cno','123002'
put 'SC','sc006','SC_Score','95'
后端编程
后端在启动时分别与本地HBase建立管理员客户端、普通客户端的连接。管理员客户端管理所有表,普通客户端管理表数据的增删改查。并启动HTTP服务提供一系列API接口。
package variable
import "github.com/tsuna/gohbase"
var AdminClient gohbase.AdminClient
var Client gohbase.Client
package main
import (
"github.com/gin-gonic/gin"
"github.com/tsuna/gohbase"
"wolflong.com/hbase_gin/router"
"wolflong.com/hbase_gin/variable"
)
func init() {
variable.AdminClient = gohbase.NewAdminClient("127.0.0.1")
variable.Client = gohbase.NewClient("127.0.0.1")
}
func main() {
r := gin.Default()
router.Router(r)
r.Run(":1313")
}
给定一个处理错误的通用方法
package controller
import "github.com/gin-gonic/gin"
func checkError(err error, c *gin.Context, handlers ...gin.HandlerFunc) {
if err != nil {
c.JSON(500, gin.H{"error": "致命错误", "back": err.Error()})
panic(err)
}
}
1.1 列出所有表的相关信息
HBase Shell 对应代码
list
从管理客户端发出请求,获取所有表,遍历表将表的命名空间与表名存储至切片中以json格式返回
type table struct {
Namespace string `json:"namespace"`
Qualifier string `json:"qualifier"`
}
func ShowTableList(c *gin.Context) {
var tables []table
t, err := hrpc.NewListTableNames(context.Background())
checkError(err, c)
res, err := variable.AdminClient.ListTableNames(t)
checkError(err, c)
for _, v := range res {
tables = append(tables, table{string(v.GetNamespace()), string(v.GetQualifier())})
}
fmt.Println(tables)
c.JSON(200, tables)
}
测试结果
[
{
"namespace": "default",
"qualifier": "SC"
},
{
"namespace": "default",
"qualifier": "course"
},
{
"namespace": "default",
"qualifier": "student"
},
{
"namespace": "default",
"qualifier": "test"
}
]
1.2 打印指定表的所有记录数据
HBase Shell 对应代码
scan "course"
获取请求参数table,从普通客户端发出请求,获取scanner,遍历scanner直到io.EOF。请注意,当查询的表没数据时,第一条拿到的是nil数据,需要进行判断。
func ShowTableRows(c *gin.Context) {
var Cells [][]*hrpc.Cell
t, err := hrpc.NewScan(context.Background(), []byte(c.Query("table")))
checkError(err, c)
res := variable.Client.Scan(t)
row, err := res.Next()
for err != io.EOF && row != nil {
Cells = append(Cells, row.Cells)
fmt.Println(row.Cells)
row, err = res.Next()
}
c.JSON(200, Cells)
}
localhost:1313/TableRows?table=course 测试结果。
请注意,Gin框架在转换二进制数据时使用BASE64编码,使得控制字符在网络上正常传输。
[
[
{
"row": "YzAwMQ==",
"family": "Q19DcmVkaXQ=",
"timestamp": 168043164029