gohbase使用文档
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使用文档的更多相关文章
- C#给PDF文档添加文本和图片页眉
页眉常用于显示文档的附加信息,我们可以在页眉中插入文本或者图形,例如,页码.日期.公司徽标.文档标题.文件名或作者名等等.那么我们如何以编程的方式添加页眉呢?今天,这篇文章向大家分享如何使用了免费组件 ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
- ABP文档 - EntityFramework 集成
文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...
- ABP文档 - SignalR 集成
文档目录 本节内容: 简介 安装 服务端 客户端 连接确立 内置功能 通知 在线客户端 帕斯卡 vs 骆峰式 你的SignalR代码 简介 使用Abp.Web.SignalR nuget包,使基于应用 ...
- ABP文档 - 通知系统
文档目录 本节内容: 简介 发送模式 通知类型 通知数据 通知重要性 关于通知持久化 订阅通知 发布通知 用户通知管理器 实时通知 客户端 通知存储 通知定义 简介 通知用来告知用户系统里特定的事件发 ...
- ABP文档 - Hangfire 集成
文档目录 本节内容: 简介 集成 Hangfire 面板授权 简介 Hangfire是一个综合的后台作业管理器,可以在ABP里集成它替代默认的后台作业管理器,你可以为Hangfire使用相同的后台作业 ...
- ABP文档 - 后台作业和工作者
文档目录 本节内容: 简介 后台作业 关于作业持久化 创建一个后台作业 在队列里添加一个新作业 默认的后台作业管理器 后台作业存储 配置 禁用作业执行 Hangfire 集成 后台工作者 创建一个后台 ...
- ABP文档 - Javascript Api
文档目录 本节内容: AJAX Notification Message UI Block & Busy Event Bus Logging Other Utility Functions A ...
随机推荐
- Spring Cloud Gateway自定义异常处理Exception Handler
版本: Spring Cloud 2020.0.3 常见的方法有 实现自己的 DefaultErrorWebExceptionHandler 或 仅实现ErrorAttributes. 方法1: Er ...
- JIPB | 两篇连发:华中农大黄俊斌团队报道二羟基异丁酰化调控稻曲病菌致病新机制
水稻是我国重要的粮食作物,稻曲病是水稻三大病害之一,不仅造成稻米产量损失,更重要的是稻曲球中的稻曲菌素的毒性和致畸作用,给人畜健康带来严重威胁.病原菌对植物的侵袭是由病原菌的毒力和植物免疫系统相互作用 ...
- .NetCore+Envoy+Id4+Dapr+EFCore 构建微服务之Envoy
.NetCore比较流行的微服务应该时是用Ocelot的方式构建微服务,纯配置化,开发量也比较小.但是做过一些项目之后发现这个方式不是很适合,首先它比较笨重,其次不支持gRpc和webSocket通信 ...
- Blazor 模板化组件开发指南
翻译自 Waqas Anwar 2021年4月15日的文章 <A Developer's Guide To Blazor Templated Components> [1] 在我之前的一篇 ...
- MySQL学习03(MySQL数据管理)
MySQL数据管理 外键 外键概念 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主 ...
- 文件流FileStream技术出现的理由漫谈
输入输出的重要性: 输入和输出功能是Java对程序处理数据能力的提高,Java以流的形式处理数据.流是一组有序的数据序列,根据操作的类型,分为输入流和输出流. 程序从输入流读取数据,向输出流 ...
- Kali 2.0 安装教程
本文适合KALI初学者,将详细介绍Kali Linux 2.0的安装过程. 首先我们到KALI的官网下载镜像,大家可以自己选择下载32或64位的KALI 2.0系统. KALI 官网:https:// ...
- stm32 connot enter debug mode
dap 可以发现设备,stlink jlink 均无法发现设备,但是都不能下载.connot enter debug mode ,发现是vdda 未连接
- 题解—P2511 [HAOI2008]木棍分割
这道题第一眼直接一个二分板子把第一问解决掉,然后主要是统计方案. 其实这个方程还不算难推,只要推出来朴素 \(dp\) ,之后的一步一步也很顺理成章,所以这种题主要看能不能静下心来慢慢做. solut ...
- 十八:使用JDBC进行批处理
一.使用Statement完成批处理 1.使用Statement对象添加要批量执行SQL语句,如下: 1 Statement.addBatch(sql1); 2 Statement.addBatch( ...