分享

关于HBase行键的问题

seraph50 发表于 2014-8-23 12:02:05 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 9 51245
提示: 作者被禁止或删除 内容自动屏蔽

已有(9)人评论

跳转到指定楼层
howtodown 发表于 2014-8-23 14:28:12
这里提供一个思路:
首先Start key, end key 确定,然后再使用RowFilter过滤
回复

使用道具 举报

seraph50 发表于 2014-8-23 17:26:05
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

sstutu 发表于 2014-8-23 20:25:13
你的id从哪里来,怎么产生的
回复

使用道具 举报

seraph50 发表于 2014-8-23 20:27:59
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

desehawk 发表于 2014-8-23 21:37:29
本帖最后由 pig2 于 2014-8-23 23:20 编辑
这里进行了一下修改:

首先你要明确 startkey与endkey的含义。
什么是start key
什么是end key
start key我这里的理解是必须包含下面三个元素,也就是说,无论是start key还是end key都必须是rowkey

散列字段-id-time
假如我们换另外一种理解:
包括:
散列字段-id
可能是这个范围是找不出来的。


如果说
id-time
个人认为这种可能性不大,但是没有验证







也就是说如果有范围的话,前缀需要是有序的,这样才能写出rowkey的范围

如果这个你认同的话,咱们继续。

那么既然是rowkey,前面有个散列字段,我们就不好确定end key都必须是rowkey,换句话说这个start key、end key是直接写不出来的。
这也就是我们所遇到的难题。


那么这个难题该如何解决?
首先我们根据下面帖子,
hbase RowFilter如何根据rowkey查询以及实例实现代码


能够达到抽出某个设备的信息,放到结果集中。这个是无容置疑的。
比如:我们就抽取设备00001的设备信息,这个通过SubstringComparator实现
如下:
  1.    Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("设备号"));
复制代码



这个设备的信息出来了,剩下我们就要做什么那-------过滤时间段。
我们可以通过mapreduce分割数据,然后过滤出某个时间段的信息。最后输出结果。





其实这里面还有另外一个思路:
因为你的设备号还有时间肯定是属于某一个列吧,你直接使用hbase的多条件查询,结果直接就出来了。

例子如下:根据自己的情况修改。
  1. /**
  2. * 组合条件查询
  3. * @param tableName
  4. */
  5. public static void QueryByCondition3(String tableName) {
  6. try {
  7. HTablePool pool = new HTablePool(configuration, 1000);
  8. HTable table = (HTable) pool.getTable(tableName);
  9. List<Filter> filters = new ArrayList<Filter>();
  10. Filter filter1 = new SingleColumnValueFilter(Bytes
  11. .toBytes("column1"), null, CompareOp.EQUAL, Bytes
  12. .toBytes("aaa"));
  13. filters.add(filter1);
  14. Filter filter2 = new SingleColumnValueFilter(Bytes
  15. .toBytes("column2"), null, CompareOp.EQUAL, Bytes
  16. .toBytes("bbb"));
  17. filters.add(filter2);
  18. Filter filter3 = new SingleColumnValueFilter(Bytes
  19. .toBytes("column3"), null, CompareOp.EQUAL, Bytes
  20. .toBytes("ccc"));
  21. filters.add(filter3);
  22. FilterList filterList1 = new FilterList(filters);
  23. Scan scan = new Scan();
  24. scan.setFilter(filterList1);
  25. ResultScanner rs = table.getScanner(scan);
  26. for (Result r : rs) {
  27. System.out.println("获得到rowkey:" + new String(r.getRow()));
  28. for (KeyValue keyValue : r.raw()) {
  29. System.out.println("列:" + new String(keyValue.getFamily())
  30. + "====值:" + new String(keyValue.getValue()));
  31. }
  32. }
  33. rs.close();
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. }
复制代码

















回复

使用道具 举报

nettman 发表于 2014-8-24 12:46:58
你前面放上散列,本身这个设计就是有问题的。
防止热点存储的方式有很多种,你这种方式不太好的。
对于rowkey的多条件查询,你也可以通过建立索引表来实现。

可以这样设计:

首先你的主表是可以这样的:
id-time




索引表可以是这样的:


rowkeycolumn family
id-time-散列字段  id-time





   
回复

使用道具 举报

seraph50 发表于 2014-8-25 10:43:45
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

nettman 发表于 2014-8-25 16:51:01
seraph50 发表于 2014-8-25 10:43
能多说几种防止热点存储的方法么
使用预分区、散列
详细可参考
HBase Rowkey的散列与预分区设计

回复

使用道具 举报

arsenduan 发表于 2017-3-3 14:49:03
参考这个
hbase hash散列后 如何scan 查询?
http://www.aboutyun.com/forum.php?mod=viewthread&tid=21143


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条