设为首页 加入收藏

TOP

'林子雨大数据' 实验3 HBase操作与接口编程(二)
2023-07-23 13:30:32 】 浏览:104
Tags:' 林子雨 实验 HBase
'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
image-20230402194007388

从管理客户端发出请求,获取所有表,遍历表将表的命名空间与表名存储至切片中以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"

image-20230402194046872


获取请求参数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
首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Go map 竟然也会发生内存泄漏? 下一篇好用的在线客服系统Go语言源码-GO..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目