java hbase的scan分页_SHDPWorking with HBase(三)之HBase+Phoenix实现分页

先简单讲讲只用HBase来实现分页的思路: HBase利用scan来扫描表,通过startKey,stopKey来确定扫描范围,在需要进行分页时可以结合HBase提供的PagefFilter过滤扫描的行数使scan返回N条数据达到分页的目的(N为每页的记数),此时有以下两种方案达可以达到分页目的:   1. 在得到scan结果后把上一页的最后一条数据作为scan下一页时的startKey,但是此时下一页的数据在传到客户端时就要排除第一条数据了(因为第一条的数据是上一页的)   2.在每次scan时多查询一条数据(即返回N+1)作为下一页的startKey   以上的方案存有个大前提:HBase的RowKey必须是序列增长(类似1,2,3,....)的,否则的话虽然能定位到下一页的startkey,但是当我要查询上一页/上N页时就不能够定位到此时的startkey了。   所以解决这个大前提的方案就是添加一个序列ID到RowKey中来帮助起始键定位到对应偏移量的位置,但是当你的RowKey存在其他字符(如汉字)时就不能简单的将序列ID添加到RowKey了。(所以仅仅通过HBase来实现分页还是比较麻烦的,特别是RowKey比较复杂的时候)   下面是具体的实现方案:   项目场景:按条件查询并实现分页(如按澳门,三亚,2016-01-02查询并分页)   这里我选择使用Phoenix来操作HBase,原因是对于简单条件的查询Phoenix速度快,并且Phoenix提供了生成序列ID的方法,对于熟悉SQL语句的开发者来说可以很好的提高开发效率。   步骤:(HBase中存在TRAVEL表)   1.在Phoenix中为TRAVEL表创建视图TRAVEL

CREATE VIEW TRAVEL (ROWKEY VARCHAR PRIMARY KEY,INFO.SP VARCHAR,INFO.EP VARCHAR,INFO.ST VARCHAR,INFO.ET VARCHAR);

(INFO为HBase表TRAVEL的列族名) 视图TRAVEL中的一段数据如下:

2e65ddc4fc9fa678e616212971bbc813.png   2.建立sequence(序列)

CREATE SEQUENCE SEQ;

3.在Phoenix中新建表PAGETRAVEL

CREATE TABLE TRAVEL (ROWKEY VARCHAR PRIMARY KEY,INFO.SP VARCHAR,INFO.EP VARCHAR,INFO.ST VARCHAR,INFO.ET VARCHAR,PAGEID BIGINT);

(字段PAGEID就是帮助起始健定位对应偏移量的分页ID) 4.通过Phoenix的UPSERT SELECT将视图TRAVEL中的数据全部插入到PAGETRAVEL表中

UPSERT INTO PAGETRAVEL SELECT ROWKEY,SP,EP,ST,ET,NEXT VALUE FOR SEQ FROM TRAVEL;

PAGETRAVEL表中的部分数据如下:

7743e4a8cc8c2369c19c8f654ba8b5ca.png 有了PAGEID后就可以轻易的确定每页起始键对应的偏移量。   5.得到每页起始键的偏移量(PAGEID)

SELECT PAGEID FROM TRAVEL WHERE ROWKEY LIKE '澳门三亚%' AND ST >= '2016-01-02';

6.分页查询

SELECT * FROM TRVELS WHERE PAGEID > PAGEID*(PAGENUM-1)*N ORDER BY PAGEID LIMIT N WHERE ROWKEY LIKE '澳门三亚%';

(PAGENUM为当前页数)

关键代码实现:

public List findPageRecords(int currentPageNum, int pageSize,String ST,String SP,String EP) {

//得到每页起始键的偏移量,第一个参数为SQL语句,第二个参数为返回值类型的Class对象,第三个参数为占位符值(为可变参数)

int startkey = jdbcTemplate.queryForObject('SELECT * FROM TRAVELS WHERE ST >= ? AND ROWKEY LIKE ? LIMIT 1',Integer.class,ST,SP+EP+'%');

//第一个参数为SQL语句,第二参数的RowMapper将每一行结果映射成一个Java对象,方便将其他封装到JavaBean中,第三个参数为占位符值(为可变参数)

List travels = jdbcTemplate.query('SELECT * FROM TRAVELS where PAGEID >= ? AND ST >= ? AND ROWKEY LIKE ? limit 8',

new RowMapper() {

public Travel mapRow(ResultSet rs, int rowNum)

throws SQLException {

Travel travel = new Travel();

travel.setROWKEY(rs.getString('ROWKEY'));

travel.setURL(rs.getString('URL'));

travel.setSP(rs.getString('SP'));

travel.setEP(rs.getString('EP'));

travel.setST(rs.getString('ST'));

travel.setET(rs.getString('ET'));

travel.setSIGHTS(rs.getString('SIGHTS'));

travel.setALLDATE(rs.getString('ALLDATE'));

travel.setHOTEL(rs.getString('HOTEL'));

travel.setTOTALPRICE(rs.getString('TOTALPRICE'));

travel.setTRAFFIC(rs.getString('TRAFFIC'));

travel.setTRAVELTYPE(rs.getString('TRAVELTYPE'));

travel.setSUPPLIER(rs.getString('SUPPLIER'));

return travel;

}

},startkey+(currentPageNum - 1)*pageSize,ST,SP+EP+'%');

return travels;

}

总结:通过与Spring JDBC的集成,利用Phoneix可以很轻易的实现HBase分页极大地提高开发效率,并且Phoenix还提供了二级索引的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于在HBase数据库中使用Java创建表的方法如下: 首先,需要导入HBaseJava API相关的包: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.client.TableDescriptor; import org.apache.hadoop.hbase.client.TableDescriptorBuilder; import org.apache.hadoop.hbase.io.compress.CompressionAlgorithm; import org.apache.hadoop.hbase.regionserver.BloomType; import org.apache.hadoop.hbase.util.Bytes; ``` 然后,通过以下代码建立与HBase数据库的连接: ```java Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "localhost"); Connection connection = ConnectionFactory.createConnection(config); Admin admin = connection.getAdmin(); ``` 其中,"localhost"为HBase数据库所在的主机名。接下来,可以使用以下代码创建表: ```java String tableName = "myTable"; TableName name = TableName.valueOf(tableName); TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(name) .setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf")) .setCompressionType(CompressionAlgorithm.GZ) .setBloomFilterType(BloomType.ROWCOL) .build()) .build(); admin.createTable(tableDescriptor); ``` 这里创建了一个名为"myTable"的表,并设置了一个名为"cf"的列族,其中设置了压缩算法和Bloom过滤器类型。最后,使用admin.createTable()方法创建表。 需要注意的是,在使用完后需要关闭与HBase数据库的连接: ```java admin.close(); connection.close(); ``` 以上就是使用JavaHBase数据库中创建表的方法,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值