【hbase】golang操作hbase

1,428 阅读3分钟

参考网址

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,及往hbase中要写入的数据
     putRequest, err := hrpc.NewPutStr(context.Background(), table, rowKey, values)

     if err != nil {
         log4go.Error(``"hrpc.NewPutStr: %s"``, err.Error())
     }
     
     // 通过客户端client,然后调用put()函数,把之前构建的putrequest写入到hbase数据库中
     _, 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()函数

图片.png

查看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())
    }
    
    // 最后检查res.Cells是否有值,如果有,就代表有该key
    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())
}

//fmt.Println("deleteRequest:", deleteRequest)

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() {
    // 连接到 HBase
    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
    }
    
    //////////////////////////////////////////////////////////
    // 插入数据(put)
    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
    }
    //////////////////////////////////////////////////////////
    // 获取数据(get)
    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))
    }
    
    ////////////////////////////////////////////////////////////
    // 删除数据(delete)
    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 服务。