一、hbase查询方式
hbase的查询实现只提供两种方式:
- 按指定rowkey获取唯一一条记录:get方法。
- 按指定条件获取一批记录:scan方法。
实现条件查询功能使用的就是scan方式,scan在使用时有以下几点值的注意:
- scan可以通过setCaching与setBatch方法提高速度(以空间换时间)
- scan可以通过setStartRow与setEndRow来限定范围。范围越小,性能越高。
- scan可以通过setFilter方法添加过滤器,这也是分页、多条件查询的基础。
二、RowFilter使用
operator | description |
less |
小于 |
less_or_equal |
小于等于 |
equal | 等于 |
not_equal | 不等于 |
greater_or_equal | 大于等于 |
greater | 大于 |
no_op | 排除所有 |
Comparator | description |
BinaryComparator | 使用bytes.comparaTo()比较 |
BinaryPrefixComparator | 和BinaryComparator差不多,从前面开始比较 |
NullComparator | |
BitComparator | |
RegexStringComparator | 正则表达式 |
subStringComparator | 把数字当成字符串,用contains()来判断 |
import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.filter.BinaryComparator; import org.apache.hadoop.hbase.filter.BinaryPrefixComparator; import org.apache.hadoop.hbase.filter.CompareFilter; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.RegexStringComparator; import org.apache.hadoop.hbase.filter.RowFilter; import org.apache.hadoop.hbase.filter.SubstringComparator; public class TestHbaseRowFilter { String tableName = "test_row_filter"; Configuration config = HBaseConfiguration.create(); /** * 部分代码来自hbase权威指南 * @throws IOException */ public void testRowFilter() throws IOException { HTable table = new HTable(config, tableName); Scan scan = new Scan(); System.out.println("小于等于row010的行"); Filter filter1 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator("row010".getBytes())); scan.setFilter(filter1); ResultScanner scanner1 = table.getScanner(scan); for (Result res : scanner1) { System.out.println(res); } scanner1.close(); System.out.println("正则获取结尾为5的行"); Filter filter2 = new RowFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*5[ DISCUZ_CODE_0 ]quot;)); scan.setFilter(filter2); ResultScanner scanner2 = table.getScanner(scan); for (Result res : scanner2) { System.out.println(res); } scanner2.close(); System.out.println("包含有5的行"); Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("5")); scan.setFilter(filter3); ResultScanner scanner3 = table.getScanner(scan); for (Result res : scanner3) { System.out.println(res); } scanner3.close(); System.out.println("开头是row01的"); Filter filter4 = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator("row01".getBytes())); scan.setFilter(filter4); ResultScanner scanner4 = table.getScanner(scan); for (Result res : scanner4) { System.out.println(res); } scanner3.close(); } /** * 初始化数据 */ public void init() { // 创建表和初始化数据 try { HBaseAdmin admin = new HBaseAdmin(config); if (!admin.tableExists(tableName)) { HTableDescriptor htd = new HTableDescriptor(tableName); HColumnDescriptor hcd1 = new HColumnDescriptor("data"); htd.addFamily(hcd1); HColumnDescriptor hcd2 = new HColumnDescriptor("url"); htd.addFamily(hcd2); admin.createTable(htd); } HTable table = new HTable(config, tableName); table.setAutoFlush(false); int count = 50; for (int i = 1; i <= count; ++i) { Put p = new Put(String.format("row%03d", i).getBytes()); p.add("data".getBytes(), String.format("col%01d", i % 10) .getBytes(), String.format("data%03d", i).getBytes()); p.add("url".getBytes(), String.format("col%01d", i % 10) .getBytes(), String.format("url%03d", i).getBytes()); table.put(p); } table.close(); } catch (IOException e) { e.printStackTrace(); } } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { TestHbaseRowFilter test = new TestHbaseRowFilter(); test.init(); test.testRowFilter(); } }
小于等于row010的行 keyvalues={row001/data:col1/1364133382268/Put/vlen=7, row001/url:col1/1364133382268/Put/vlen=6} keyvalues={row002/data:col2/1364133382268/Put/vlen=7, row002/url:col2/1364133382268/Put/vlen=6} keyvalues={row003/data:col3/1364133382268/Put/vlen=7, row003/url:col3/1364133382268/Put/vlen=6} keyvalues={row004/data:col4/1364133382268/Put/vlen=7, row004/url:col4/1364133382268/Put/vlen=6} keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6} keyvalues={row006/data:col6/1364133382268/Put/vlen=7, row006/url:col6/1364133382268/Put/vlen=6} keyvalues={row007/data:col7/1364133382268/Put/vlen=7, row007/url:col7/1364133382268/Put/vlen=6} keyvalues={row008/data:col8/1364133382268/Put/vlen=7, row008/url:col8/1364133382268/Put/vlen=6} keyvalues={row009/data:col9/1364133382268/Put/vlen=7, row009/url:col9/1364133382268/Put/vlen=6} keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6} 正则获取结尾为5的行 keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6} keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6} keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6} keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6} keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6} 包行有5的行 keyvalues={row005/data:col5/1364133382268/Put/vlen=7, row005/url:col5/1364133382268/Put/vlen=6} keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6} keyvalues={row025/data:col5/1364133382268/Put/vlen=7, row025/url:col5/1364133382268/Put/vlen=6} keyvalues={row035/data:col5/1364133382268/Put/vlen=7, row035/url:col5/1364133382268/Put/vlen=6} keyvalues={row045/data:col5/1364133382268/Put/vlen=7, row045/url:col5/1364133382268/Put/vlen=6} keyvalues={row050/data:col0/1364133382268/Put/vlen=7, row050/url:col0/1364133382268/Put/vlen=6} 开头是row01的 keyvalues={row010/data:col0/1364133382268/Put/vlen=7, row010/url:col0/1364133382268/Put/vlen=6} keyvalues={row011/data:col1/1364133382268/Put/vlen=7, row011/url:col1/1364133382268/Put/vlen=6} keyvalues={row012/data:col2/1364133382268/Put/vlen=7, row012/url:col2/1364133382268/Put/vlen=6} keyvalues={row013/data:col3/1364133382268/Put/vlen=7, row013/url:col3/1364133382268/Put/vlen=6} keyvalues={row014/data:col4/1364133382268/Put/vlen=7, row014/url:col4/1364133382268/Put/vlen=6} keyvalues={row015/data:col5/1364133382268/Put/vlen=7, row015/url:col5/1364133382268/Put/vlen=6} keyvalues={row016/data:col6/1364133382268/Put/vlen=7, row016/url:col6/1364133382268/Put/vlen=6} keyvalues={row017/data:col7/1364133382268/Put/vlen=7, row017/url:col7/1364133382268/Put/vlen=6} keyvalues={row018/data:col8/1364133382268/Put/vlen=7, row018/url:col8/1364133382268/Put/vlen=6} keyvalues={row019/data:col9/1364133382268/Put/vlen=7, row019/url:col9/1364133382268/Put/vlen=6}
相关推荐
其核心特性之一便是通过Rowkey进行数据查询,因此Rowkey的设计对于HBase的读写性能至关重要。Rowkey不仅需要包含关键检索信息,还要兼顾查询方式和数据存储格式,以避免全表扫描导致的效率低下。 在HBase中,...
HBase是一个分布式、高性能的NoSQL数据库,适合存储海量结构化半结构化数据,而Spark则是一个强大的计算框架,擅长处理大规模数据集,尤其在实时分析和交互式查询方面表现出色。当我们需要将Spark处理的数据存储到...
HBase RowKey 设计与协处理器运用 HBase 是一个基于 HDFS 的分布式、面向列的 NoSQL 数据库,具有高性能、可靠性和扩展性等特点。本文将详细介绍 HBase 的 RowKey 设计和协处理器运用。 HBase 的介绍 HBase 是一...
2)、RowKey散列原则:如果RowKey是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将RowKey的高位作为散列字段,由程序循环生成,低位放时间
在HBase中,行键(RowKey)的设计是至关重要的,因为它直接影响到数据的存取效率和查询性能。HBase是一种分布式、列式存储的NoSQL数据库,它以Key-Value的形式存储数据,并且主要依赖RowKey进行快速定位。由于HBase...
正因为这种灵活性,用户在使用HBase时需要特别注意RowKey的设计,以保证数据的可访问性和查询效率。 在读写流程中,HBase将数据横向分割成多个Region,并将这些Region分布在不同的RegionServer上。每个Region对应一...
用户历史订单列表查询rowkey设计技巧 最左前缀原则
rowkey的设计应尽量短小,以减少存储空间的消耗和提高查询效率。 客户端调优涉及多个参数。例如,设置scanner缓存大小可以减少对服务器的请求次数,关闭autoflush可以减少写入的频率从而提高写入性能,而调整write ...
因为面向列的特点,Hbase只能单单地以rowkey为主键作查询,而无法对表进行多维查询和join操作,并且查询通常都是全表扫描,耗费资源较大,查询效率较低。类比于传统型数据库里的一些查询方式,本文对Hbase的存储原理进行了...
"大数据性能调优之HBase的RowKey设计" 大数据功能调优之HBase的RowKey设计是指在HBase中对RowKey的设计,以提高HBase的性能和可扩展性。RowKey是HBase中的一种二进制码流,可以是任意字符串,最大长度为64kb,但...
- **客户端侧索引(Client-side Indexing)**:在应用层实现,每次查询时先通过索引找到RowKey,再用RowKey去HBase查询。 - ** Coprocessor**:HBase的扩展机制,可以在RegionServer端实现简单的索引功能。 - ** ...
《深入探讨HBase查询机制》 HBase,作为一款分布式列式存储系统,以其高效、可扩展的特性在大数据领域广泛应用。本文将深入探讨HBase的查询机制,以帮助我们理解其背后的运作原理。 首先,我们需要了解HBase的查询...
rowkey 是 HBase 的 key-value 存储中的 key,通常使用用户要查询的字段作为 rowkey,查询结果作为 value。 * 数字 rowkey 的排序:HBase 原生只支持从小到大的排序,可以通过设计 rowkey = Integer.MAX_VALUE-...
3. 查询功能实现:根据RowKey查询数据是HBase的基本操作,通过输入RowKey,后台执行get操作获取对应行数据,并展示在页面上。 4. 表管理:支持HBase的建表和删除操作,这需要调用HBase的Admin API,完成表的创建、...
在HBase这种分布式列式数据库中,Rowkey的设计至关重要,因为它直接影响着数据的分布和查询效率。以下是关于HBase Rowkey设计的一些关键知识点: 1. 唯一性原则:Rowkey必须确保全局唯一,避免数据冲突。这可以通过...