hbase实现分页查询

[Author]: kwu

hbase实现分页查询,实现按时间查询最新的15条,hbase的查询主要是通过rowkey来进行的,保证查询的高效。column的filter查询效率较低。

1、rowkey的设计

以时间的倒序进行查询,如20150818_152130来看,设计rowkey

20150818的hash64值+(999999-152130)。

1)MurmurHash的64的冲突非常小,并实现rowkey的散列。

2)日分秒与999999的差值,可以实现逆序

2、插入数据的操作

String[] splited = jsData.split("`");

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
String format = sdf.format(date);

String dateday = format.substring(0, 8);
String datehour = format.substring(8, 10);
String dateMin = format.substring(10, 12);
String dateSec = format.substring(12, 14);

int datehourSub = 99 - new Integer(datehour);
int dateMinSub = 99 - new Integer(dateMin);
int dateSecSub = 99 - new Integer(dateSec);

String dateHash = MurmurHash.hash64(dateday) + "_" + datehourSub  + dateMinSub  + dateSecSub;

Put put = new Put((dateHash + "_" + splited[0]).getBytes());
put.add("cf1".getBytes(), "bdcCookieId".getBytes(), splited[0].getBytes());
put.add("cf1".getBytes(), "pcScreenRatio".getBytes(), splited[1].getBytes());
put.add("cf1".getBytes(), "objClassName".getBytes(), splited[2].getBytes());
put.add("cf1".getBytes(), "pageOpenTime".getBytes(), splited[3].getBytes());
put.add("cf1".getBytes(), "pageLoadCompleteTime".getBytes(), splited[4].getBytes());
put.add("cf1".getBytes(), "pageCloseTime".getBytes(), splited[5].getBytes());
put.add("cf1".getBytes(), "category".getBytes(), splited[6].getBytes());
put.add("cf1".getBytes(), "browserVersion".getBytes(), splited[7].getBytes());
put.add("cf1".getBytes(), "currentURL".getBytes(), splited[8].getBytes());
put.add("cf1".getBytes(), "targetParentURL".getBytes(), splited[9].getBytes());
put.add("cf1".getBytes(), "referrer".getBytes(), splited[10].getBytes());
put.add("cf1".getBytes(), "clickX".getBytes(), splited[11].getBytes());
put.add("cf1".getBytes(), "clickY".getBytes(), splited[12].getBytes());
put.add("cf1".getBytes(), "targetURL".getBytes(), splited[13].getBytes());
put.add("cf1".getBytes(), "objID".getBytes(), splited[14].getBytes());
put.add("cf1".getBytes(), "objName".getBytes(), splited[15].getBytes());
put.add("cf1".getBytes(), "objValue".getBytes(), objValue.getBytes());
put.add("cf1".getBytes(), "siteCookieId".getBytes(), splited[17].getBytes());
put.add("cf1".getBytes(), "scrollValue".getBytes(), splited[18].getBytes());
put.add("cf1".getBytes(), "sessionId".getBytes(), splited[19].getBytes());
put.add("cf1".getBytes(), "ip".getBytes(), splited[20].getBytes());
put.add("cf1".getBytes(), "macAdress".getBytes(), splited[21].getBytes());
put.add("cf1".getBytes(), "gaId".getBytes(), splited[22].getBytes());
put.add("cf1".getBytes(), "baiduId".getBytes(), splited[23].getBytes());
put.add("cf1".getBytes(), "activeTime".getBytes(), splited[24].getBytes());
put.add("cf1".getBytes(), "status".getBytes(), splited[25].getBytes());
put.add("cf1".getBytes(), "triggertime".getBytes(), splited[26].getBytes());

List<Put> list = new ArrayList<Put>();
list.add(put);

HTable table = new HTable(configuration, "jsActionPage");
table.put(list);

table.close();

3、查询 利用scan 时间倒序

HTable table = new HTable(configuration, "jsActionPage");
Scan scan = new Scan();
scan.setStartRow(startRow.getBytes());
scan.setStopRow(stopRow.getBytes());

JSONObject resultJson = new JSONObject();

JSONObject temp = null;
ResultScanner scanner = table.getScanner(scan);

for (Result result : scanner) {
	JSONArray jsonArray = new JSONArray();

	String rowkey = "";
	for (KeyValue keyValue : result.raw()) {
		byte[] row = keyValue.getRow();
		rowkey = new String(row);

		String qualifier = new String(keyValue.getQualifier());
		String value = new String(keyValue.getValue());

		temp = new JSONObject();
		temp.put(qualifier, value);
		jsonArray.add(temp);
	}
	resultJson.put(rowkey, jsonArray);
}

table.close();

最后返回json的数据格式

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 20:15:34

hbase实现分页查询的相关文章

HBase多条件及分页查询的一些方法

HBase是Apache Hadoop生态系统中的重要一员,它的海量数据存储能力,超高的数据读写性能,以及优秀的可扩展性使之成为最受欢迎的NoSQL数据库之一.它超强的插入和读取性能与它的数据组织方式有着密切的关系,在逻辑上,HBase的表数据按RowKey进行字典排序, RowKey实际上是数据表的一级索引(Primary Index),由于HBase本身没有二级索引(Secondary Index)机制,基于索引检索数据只能单纯地依靠RowKey.也只有使用RowKey查询数据才能得到非常高

Java链接HBASE数据库,创建一个表,删除一张表,修改表,输出插入,修改,数据删除,数据获取,显示表信息,过滤查询,分页查询,地理hash

准备工作 1.创建Java的Maven项目 创建好的目录结构如下:  另外注意junit的版本,最好不要太高,最开始笔者使用的junit4.12的,发现运行的时候会报错.最后把Junit的版本改成4.7的之后,问题解决了. 创建测试工具类HbaseDemo,为了保证能够让Hbase运行,需要最开始写出如下配置: package toto.com.hbase; import java.util.ArrayList; import java.util.Iterator; import org.apa

hbase分页查询实现

Hbase本身是没有分页查询的,我在网上找了很多资料来实现一个分页功能,在这里做了一下记录,分享给大家,有什么不足之处,请尽管指出.废话不多说,看代码. import java.io.IOException; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUt

基于Solr的HBase多条件查询测试

转自:http://www.cnblogs.com/chenz/articles/3229997.html 背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力.针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证. 原理: 基于Solr的HBase多条件查询原理很简单,将HBas

基于Solr的HBase多条件查询

基于Solr的HBase多条件查询——转载: 背景: 某电信项目中采用HBase来存储用户终端明细数据,供前台页面即时查询.HBase无可置疑拥有其优势,但其本身只对rowkey支持毫秒级的快速检索,对于多字段的组合查询却无能为力. 针对HBase的多条件查询也有多种方案,但是这些方案要么太复杂,要么效率太低,本文只对基于Solr的HBase多条件查询方案进行测试和验证. 原理: 基于Solr的HBase多条件查询原理很简单,将HBase表中涉及条件过滤的字段和rowkey在Solr中建立索引,

hbase列表分页

HBase的分页实现相对复杂一些.核心思想是结合分页过滤器PageFilter(pageSize)和查询设置开始行scan.setStartRow(lastRow),lastRow为上一次查询rowkey,需要注意的是该rowkey是一个数组,对应多字段的存储位置; 不同用户登录会产生不同lastRow,因此我们把lastRow存储到session中,参考PageLastRowCache. 为了解耦,我们又把对lastRow操作封装到HBaseDaoImpl,以便开发写代码的时候不需要关心las

mysql分库 分页查询

Mysql海量数据分表分库如何列表分页? 1.现在使用ElasticSearch了.基于Lucene的解决方案 2.必须将mysql里的数据写入到类似hbase这样的分布式数据库,查询快.但分页.查询的话,可以在hbase前加一层solr,用于建立数据索引 如何对分库后的数据进行分页查询? yeyingsheng 发布于 2015/04/21 10:18 阅读 7K+ 收藏 1 答案 7 Spring iBATIS si项目,现在连接6台mysql数据库,路由分库算法是根据id的hash值%6,

Oracle分页查询

一.利用rownum,无order by(最优方案) 如下例查询出来5003行数据,然后扔掉了前面5000行,返回后面的300行.经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然. SELECT * FROM (SELECT ROWNUM AS rowno, t.* FROM XXX t WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd') AND TO_DATE ('20060731',

QBC查询、离线条件查询(DetachedCriteric)和分页查询模版

一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的静态方法, 这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件. Criteria的add()方法用于加入查询条件. 3.调用Criteria的list()方法执行查询语句.该方法返回List类型的查询结果,在 List集合中存放了符合查询条件的持久化对象. 比较运