最近一些工作的总结(关于HBase Coprocessor,多版本多条件检索多Rowkey检索)

2024-04-20 06:18

本文主要是介绍最近一些工作的总结(关于HBase Coprocessor,多版本多条件检索多Rowkey检索),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先是HBase协处理器的一些理解上的问题。
之前写的博文HBase Coprocessor是按照别人的代码做的一个测试小实验,虽然成功了,但是没有完全理解,所以当自己真的要用协处理器的时候重新理解了一下。
其实,协处理器实现二级索引的本质是自动维护两张表格。比如我需要的主表如下
HBase主表
需要对列族 Coid的 LatLonCode变量做一个二级索引,其实就是维护另一张表,我把它称为协处理表,这个表的Rowkey就是这个LatLonCode的值,而表中列族就是主表的Rowkey。所以设计协处理表如下
协处理表
所以检索的时候,如果要通过LatLonCode的值得到对应的属性数据,先检索协处理表,得到这个值对应的主表Rowkey值,也就是ID,再根据这个Rowkey到主表中去检索对应的数据。
所以,上述过程的协处理器JAVA代码应该是这样的。

public class IDCoprocessor extends BaseRegionObserver {//Coprocessor table nameprivate static final byte[] TABLE_NAME=Bytes.toBytesBinary("DataCoid");// Main table familyprivate static final byte[] COLUMN_FAMILY1=Bytes.toBytes("Coid");// Main table column that is to be coprocessedprivate static final byte[] COLUMN1=Bytes.toBytes("LatLonCode");// Coprocessor table family and column// value of LatLineCode is equal to Rowkey in the main tableprivate static final byte[] COLUMN_FAMILY2=Bytes.toBytes("ID");private static final byte[] COLUMN2=Bytes.toBytes("LatLineCode");private Configuration configuration=HBaseConfiguration.create();public void prePut(ObserverContext<RegionCoprocessorEnvironment>e, Put put, WALEdit edit,Durability durability) {// get the values from the main tableList<Cell> kv=put.get(COLUMN_FAMILY1, COLUMN1);Iterator<Cell> kvIterator=kv.iterator();try {HTable Coid=new HTable(configuration,TABLE_NAME);while(kvIterator.hasNext()) {Cell tmp=kvIterator.next();final byte[] value=CellUtil.cloneValue(tmp);// value as the rowkey to put to the coprocessor tablePut indexPut=new Put(value);indexPut.addColumn(COLUMN_FAMILY2, COLUMN2, CellUtil.cloneRow(tmp));Coid.put(indexPut);}Coid.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}

接下来是多版本检索的问题。
HBase的Rowkey是唯一的,不然在put的时候,不同版本的数据其实是会覆盖的。但是把LatLonCode这个Column的值作为协处理表的Rowkey,这个值极有可能不是唯一的。也就是说在主表中,不同Rowkey下对应的LatLonCode值相同。这个时候,在协处理表中就要处理多版本数据的存储和检索问题。
一开始以为只需要在检索的时候加上setMaxVersion()就可以了,其实在HBase创建表的时候就需要设置表格存储多版本数据。
在HBase shell里设置协处理表的属性

hbase > alter 'Datacoid',{NAME=>'ID',VERSIONS=>100}

把协处理表Datacoid的ID列族修改为可以存储100个版本的数据。然后在检索的时候直接setMaxVersion()了

关于多条件的检索。
JAVA操作HBaseIO时获取数据有两种方式,get是根据rowkey获得某一行的数据,而scan可以设置查询条件,从而获得符合条件的所有数据,比如rowkey大于某个值小于某个值,或者针对rowkey的正则表达式检索等。
用scan进行查询通过设置过滤器filter来设置查询条件,如果有多个查询条件,通过FilterList实现。
具体参考FilterList

另外,get是一次get一条数据,如果rowkey有很多,比如我需要get 20多万条数据,这个时候一条创建一个get是非常耗时的,可以用 List<Get>方法,对每一个Rowkey创建一个Get,然后把Get放到一个List里,直接获取。

public void Run(float latstart,float latend,float lonstart,float lonend) {EncodeNOIGRF Eno=new EncodeNOIGRF(latstart,latend,lonstart,lonend);Object[] codes=Eno.getCodes();ArrayList<String> codes2check=(ArrayList<String>) codes[1];Iterator<String> iterator=codes2check.iterator();List<Get> get2check=new ArrayList<Get>();while(iterator.hasNext()) {// every rowkey a new Get, and add it to List<Get> get2checkGet get=new Get(Bytes.toBytes(iterator.next()));get2check.add(get);}Result[] results2check;try {results2check = this.table.get(get2check);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

这篇关于最近一些工作的总结(关于HBase Coprocessor,多版本多条件检索多Rowkey检索)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919490

相关文章

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

java中不同版本JSONObject区别小结

《java中不同版本JSONObject区别小结》本文主要介绍了java中不同版本JSONObject区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录1. FastjsON2. Jackson3. Gson4. org.json6. 总结在Jav

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作