1. 建立连接

import (
"context"
"github.com/tsuna/gohbase"
"github.com/tsuna/gohbase/hrpc"
"github.com/tsuna/gohbase/filter"
)
// 这里host指的是zk链接
client := gohbase.NewClient(host)
adminClient := gohbase.NewAdminClient(host)

2. 创建表

tableName := "test"  // 要创建的表名
families := map[string]map[string]string{
"cf": { // 列族名, 允许有多个列族, 以下参数全为非必填参数
// 是否使用布隆过虑及使用何种方式
// ROW: 对 ROW,行键的哈希在每次插入行时将被添加到布隆。
// ROWCOL: 行键 + 列族 + 列族修饰的哈希将在每次插入行时添加到布隆
// NONE:
"BLOOMFILTER": "ROW",
// 数据保留的版本数, 如果不需要保留老版本数据, 可以调低此参数来节约磁盘空间
"VERSIONS": "3",
// 是否常驻内存
"IN_MEMORY": "false",
//
"KEEP_DELETED_CELLS": "false",
//
"DATA_BLOCK_ENCODING": "FAST_DIFF",
// 默认是 2147483647 即:Integer.MAX_VALUE 值大概是68年
// 这个参数是说明该列族数据的存活时间,单位是s
// 这个参数可以根据具体的需求对数据设定存活时间,超过存过时间的数据将在表中不在显示,
// 待下次major compact的时候再彻底删除数据.
// 注意的是TTL设定之后 MIN_VERSIONS=>’0’ 这样设置之后,TTL时间戳过期后,
// 将全部彻底删除该family下所有的数据,如果MIN_VERSIONS 不等于0那将保留
// 最新的MIN_VERSIONS个版本的数据,其它的全部删除,比如MIN_VERSIONS=>’1’ 届时将保留一个最新版本的数据,
// 其它版本的数据将不再保存。
"TTL": "2147483647",
// 指定列族是否采用压缩算法以及使用什么压缩算法NONE: 不使用压缩
// SNAPPY/ZIPPY: 压缩比22.2%, 压缩172MB/s, 解压409MB/s
// LZO: 压缩比20.5%, 压缩135MB/s, 解压410MB/s
// GZIP: 压缩比13.4%, 压缩21MB/s, 解压118MB/s
"COMPRESSION": "NONE",
// major compact的后保留的最少版本数
"MIN_VERSIONS": "0",
//
"BLOCKCACHE": "true",
//
"BLOCKSIZE": "65536",
//
"REPLICATION_SCOPE": "0",
}
}
ct := hrpc.NewCreateTable(context.Background(), []byte(tableName), families)
err := adminClient.CreateTable(ct)

3. 插入记录

rowKey := "18hd9j9aisdj9j9832dn9ooijd" // RowKey
value := map[string]map[string][]byte{
"cf" { // 列族名, 与创建表时指定的名字保持一致
"col1": []byte("val1"), // 列与值, 列名可自由定义
"col2": []byte("val2"),
"col3": []byte("val3"),
}
}
putRequest, err := hrpc.NewPutStr(context.Background(), tableName, rowKey, value)
res := client.Put(putRequest)

4. 删除记录

// 删除整条记录, value为空即可
req, err := hrpc.NewDelStr(context.Background(), tableName, rowKey, value)
res, err := client.Delete(req)

5. 查询记录

5.1 根据RowKey查询

getRequest, err = hrpc.NewGetStr(context.Background(), tableName, rowKey)
getRes, err = client.Get(getRequest)

5.2 scan范围查询

// 范围查询 [startRow, stopRow), 查询结果比较多时注意限制循环次数
getRequest, err := hrpc.NewScanRangeStr(context.Background(), tableName, startRow, stopRow)
scan := client.Scan(getRequest)
var res []*hrpc.Result
for {
getRsp, err := scan.Next()
if err == io.EOF || getRsp == nil {
break
}
if err != nil {
log.Print(err, "scan.Next")
}
res = append(res, getRsp)
}

5.3 复杂查询(过滤器的使用)

var hf []func(hrpc.Call) error
// 只查询固定的列{cf: [col1, col2]}
var Families map[string][]string
hf = append(hf, hrpc.Families(Families))
// f值的获取方式请继续往下阅读
hf = append(hf, hrpc.Filters(f))
getRequest, err = hrpc.NewGetStr(context.Background(), tableName, rowKey, hf...)
getRequest, err := hrpc.NewScanRangeStr(context.Background(), tableName, startRow, stopRow, hf...)

5.3.1 比较过滤器

比较过滤器不单独使用, 需配合其它过滤器使用
value := "aaaaa"
comparable := filter.NewByteArrayComparable([]byte(value))
var fc filter.Comparator
// 二进制比较器(精确匹配)
fc = filter.NewBinaryComparator(comparable)
// LongComparator
fc = filter.NewLongComparator(comparable)
// 前缀比较
fc = filter.NewBinaryPrefixComparator(comparable)
// BitComparator 字节比较
bitwiseOpInt := 1 // 1 AND, 2 OR, 3 XOR
bitwiseOp := filter.BitComparatorBitwiseOp(bitwiseOpInt)
fc = filter.NewBitComparator(bitwiseOp, comparable)
// NullComparator
fc = filter.NewNullComparator()
// 正则比较
/*
* 2: 忽略大小写, 4: 忽略空白和注释,
* 8: 多行匹配,默认情况下以行为单位匹配
* 32:使 . 能匹配所有符号
* 更多值参见JAVA正则flags值
*/
PatternFlags := 2
Charset := "utf-8" // 字符集, 用于将行键转换为字符串以便与正则进行匹配
Engin := "JAVA" // 正则引擎, JAVA, JONI
fc = filter.NewRegexStringComparator(value, PatternFlags, Charset, Engine)
// 子串比较
fc = filter.NewSubstringComparator(value) /*
* 0: 小于, 1: 小于等于, 2: 等于, 3: 不等于,
* 4: 大于等于, 5: 大于, 6: 无操作
*/
CompareOp := 2
var f *filter.CompareFilter
f = filter.NewCompareFilter(filter.CompareType(CompareOp), fc)

5.3.2 行过滤器

var f filter.Filter
// 限制返回条数
f = filter.NewPageFilter(100)
// 前缀过滤
f = filter.NewPrefixFilter([]byte("prefix"))
// QualifierFilter
f = filter.NewQualifierFilter(f.(*filter.CompareFilter))
// 随机过滤
//设定一个概率值, 返回对应百分比的数据量(非严格执行)
//设为0则全部过滤, 设为1则全部包含
f = filter.NewRandomRowFilter(0.8)
// 使用比较过滤器过滤RowKey
f = filter.NewRowFilter(f.(*filter.CompareFilter))
// TimestampsFilter
f = filter.NewTimestampsFilter(r.Timestamps)
// 使用比较过滤器过滤value
f = filter.NewValueFilter(f.(*filter.CompareFilter))
// 范围过滤, 后两个参数分别表示返回结果是否包含startRow和stopRow
f = filter.NewRowRange([]byte(startRow), []byte(stopRow), true, false)
// 组合范围过滤器
var rowRangeList *filter.RowRange
f = filter.NewMultiRowRangeFilter(rowRangeList)
//scan操作时不包含截止行, 使用此过滤器可以将stopRow含在结果内
f = filter.NewInclusiveStopFilter([]byte(stopRow))
// FuzzyRowFilter
var bbp []*filter.BytesBytesPair
bbp = append(bbp, filter.NewBytesBytesPair([]byte, []byte))
f = filter.NewFuzzyRowFilter(bbp)

5.3.3 列过滤器

// 限制返回的列的数量
f = filter.NewColumnCountGetFilter(10)
// 列分页
f = filter.NewColumnPaginationFilter(limit, offset, []byte(columnOffset))
// 通过前缀过滤列
f = filter.NewColumnPrefixFilter([]byte(prefix))
// 列范围匹配过滤器
// 后两个参数控制是否包含边界
f = filter.NewColumnRangeFilter([]byte(minColumn), []byte(maxColumn), true, false)
// DependentColumnFilter
f = filter.NewDependentColumnFilter(f.(*filter.CompareFilter), []byte(c.ColumnFamily), []byte(c.ColumnQualifier), true)
//多列前缀匹配
f = filter.NewMultipleColumnPrefixFilter(sortedPrefix)
// SingleColumnValueFilter
f = filter.NewSingleColumnValueFilter([]byte(ColumnFamily),
[]byte(ColumnQualifier), compareOP, fc,
FilterIfMissing, LatestVersionOnly)
// SingleColumnValueExcludeFilter
f = filter.NewSingleColumnValueExcludeFilter(f.(*filter.SingleColumnValueFilter))
//返回的数据不包括实际的单元值,只包含行键与列
f = filter.NewKeyOnlyFilter(true)
//只返回每一行的第一列
f = filter.NewFirstKeyOnlyFilter()
//通过设置一组需要匹配的列,只要匹配到任意一个列就会停止这一行的扫描操作进行下一行的扫描
f = filter.NewFirstKeyValueMatchingQualifiersFilter([][]byte)

5.4.3 列族过滤器

f = filter.NewFamilyFilter(f.(*filter.CompareFilter))

gohbase使用文档的更多相关文章

  1. C#给PDF文档添加文本和图片页眉

    页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...

  2. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  3. ABP文档 - Javascript Api - AJAX

    本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...

  4. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  5. ABP文档 - SignalR 集成

    文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...

  6. ABP文档 - 通知系统

    文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...

  7. ABP文档 - Hangfire 集成

    文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...

  8. ABP文档 - 后台作业和工作者

    文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...

  9. ABP文档 - Javascript Api

    文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...

随机推荐

  1. Python实现三次密码验证

    需求:Python实现三次密码验证,每次验证结果需要提示,三次验证不通过需要单独提示 代码如下: user = '张无忌' password = '12345678' confirm_flag = F ...

  2. Typora加七牛云实现实时图片自动上传

    Typora加七牛云实现实时图片自动上传 前言: ​ Typora是一款轻便简洁的Markdown编辑器,支持即时渲染技术,这也是与其他Markdown编辑器最显著的区别.重点是免费! ​ 其风格简约 ...

  3. Spring Cloud Alibaba - Spring Cloud Stream 整合 RocketMQ

    Spring Cloud Stream 简介 在微服务的开发过程中,可能会经常用到消息中间件,通过消息中间件在服务与服务之间传递消息,不管你使用的是哪款消息中间件,比如RabbitMQ.Kafka和R ...

  4. MySQL学习03(MySQL数据管理)

    MySQL数据管理 外键 外键概念 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主 ...

  5. 从MySQL大量数据清洗到TiBD说起

    从MySQL大量数据清洗到TiBD说起 一.业务场景: 公司主要做的业务是类似贝壳的二手房租售,公司数据库存了上亿级别的房源数据,之前的数据库使用的是 mysql,后面需要将mysql数据库切换成了 ...

  6. SQL 练习34

    求每门课程的学生人数 SELECT cid,COUNT(cid) 课程人数 from sc GROUP BY cid

  7. 【AIOT】智能感知--物

    From: https://liudongdong1.github.io/ 1. 物体检测 .1. 流体 D. V. Q. Rodrigues, D. Rodriguez and C. Li, &qu ...

  8. C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用

    一. 构造函数是干什么的   class Counter   {   public:            // 类Counter的构造函数            // 特点:以类名作为函数名,无返回 ...

  9. 流媒体 Ubuntu部署srs、windows部署nginx

    一.获取项目//码云克隆git clone https://gitee.com/winlinvip/srs.oschina.git srs//githubgit clone https://githu ...

  10. PE文件结构(32/64差异)

    1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是"虚拟地址"而不是"物理地址".为什么不是"物理地址"呢?因为数据在内 ...