2015-05-25 22 views
0

我有一个用例,我想要3级复合密钥。 例如。 Rollnumber:类:friendsRollNumberHbase中的三合成密钥

我要查询“获取所有的朋友为特定的卷号和一类”

我无法找到足够的例子在网超过它一起使用组合键和范围扫描。

目前,我正在做以下工作。

byte[]rowkey = Bytes.add(Bytes.tobytes("myrollnumber"),Bytes.tobytes("myClass"),Bytes.tobytes("myFriendsRollNumber")) 

这是我形成行键的方式。 它会根据myRollNumber和myClass选择区域服务器吗?如果不是,我该怎么做?

另外,对于范围扫描,使用它的正确方法是什么。我正在以下面的方式做。我仍然在编写代码,所以没有对它进行测试。

Scan s = new Scan(); 
Filter f = New PrefixFilter(Bytes.tobytes("myrollnumber"),Bytes.tobytes("class")) 
s.setFilter(f) 

是扫描按我的要求正确上述方法是什么?

另外,如何从扫描仪获取rowKey的各个部分?

回答

0

试试这个:

byte[] prefix=Bytes.toBytes("rollnumber" + "class"); 
Scan scan = new Scan(prefix)); 
PrefixFilter prefixFilter = new PrefixFilter(prefix); 
scan.addFilter(prefixFilter); 
ResultScanner resultScanner = table.getScanner(scan); 
+0

这并不回答我的完整问题。就像在插入行键时如何选择Regionserver一样。我希望它根据卷号和类别进行选择,以便范围对我有效 – Peter

+0

此代码片段将为您提供所有朋友数据。区域服务器将根据您的行密钥进行选择。 HBase根据时间顺序决定RS,以维护每个RS上的密钥范围。如果它是连续的,那么可能是一个问题,否则没有问题。 – Ashish

+0

我的查询将获得特定班级的卷号的所有朋友。所以我不希望查询跨越区域服务器。有没有一种方法在hbase中,以便我可以选择行密钥的最后两部分作为选择区域服务器的分区键 – Peter

0

为了您的要求,您可以使用启动扫描的停排功能。你不需要过滤器。

byte[]startRow= Bytes.add(Bytes.tobytes("search_rollnumber"),Bytes.tobytes("myClass")); 
byte[]stopRow= Bytes.add(Bytes.tobytes("search_rollnumber"),Bytes.tobytes("myClass")); 
stopRow[stopRow.length - 1]++; 
Scan s = new Scan(startRow, stopRow); 

使用此扫描您将获得以search_rollnumberMyClass开头的所有行。 我不确定你在你的rowkey中使用:但我认为你应该如果rollnumber和class都表示为整数。