Hadoop HBase“;介于;过滤器
我正在尝试使用筛选器列表检索范围内的行,但未成功。 下面是我的代码片段 我想检索1000到2000之间的数据 HTable table=新的HTable(conf,“传输数据”)Hadoop HBase“;介于;过滤器,hadoop,hbase,Hadoop,Hbase,我正在尝试使用筛选器列表检索范围内的行,但未成功。 下面是我的代码片段 我想检索1000到2000之间的数据 HTable table=新的HTable(conf,“传输数据”) List filters=new ArrayList(); SingleColumnValueFilter filter1=新的SingleColumnValueFilter(Bytes.toBytes(“TRAN”), 字节.toBytes(“传输ID”), 新的二进制比较器(Bytes.toBytes(“1000”
List filters=new ArrayList();
SingleColumnValueFilter filter1=新的SingleColumnValueFilter(Bytes.toBytes(“TRAN”),
字节.toBytes(“传输ID”),
新的二进制比较器(Bytes.toBytes(“1000”));
filter1.setFilterIfMissing(true);
过滤器。添加(过滤器1);
SingleColumnValueFilter filter2=新的SingleColumnValueFilter(Bytes.toBytes(“TRAN”),
字节.toBytes(“传输ID”),
新的二进制比较器(Bytes.toBytes(“2000”));
过滤器。添加(过滤器2);
过滤器列表过滤器列表=新过滤器列表(过滤器);
扫描=新扫描();
scan.setFilter(过滤器列表);
ResultScanner scanner1=table.getScanner(扫描);
System.out.println(“扫描结果1-必须全部通过”);
int n=0;
用于(结果:scanner1){
for(KeyValue:result.raw()){
System.out.println(“KV:+KV+”,值:
+toString(kv.getValue());
{
n++;
}
}
扫描头1.close();
使用
1.SingleColumnValueFilter过滤器2=新的SingleColumnValueFilter(Bytes.toBytes(“事务”), 字节。toBytes(“TRANS_ID”), CompareFilter.CompareOp.LESS,新的子字符串比较器(“5000”)
看起来没问题。检查是否已将它们持久化为“1000”和“2000”,而不是1000和2000的字节[]
Rest在我看来很好。在这里有一件事肯定是关闭的,那就是在创建FILTERLIST时,您还必须指定FILTERLIST.Operator,否则无法确定FILTERLIST将如何处理多个筛选器。在您的情况下,它应该类似于:-
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);
查看这是否有帮助。1过滤器列表默认运算符为operator.MUST\u PASS\u ALL。您的代码对此没有问题。
2如果将字符串作为字节放入hbase,则您的选择是错误的。
因为“1000”<“2”<“5000”
Put Put=new Put(rowKey\u-ForTest);
添加(ColumnFamilyName,QName1,Bytes.toBytes(“2”));
表.put(put);
列表过滤器=新的ArrayList();
SingleColumnValueFilter过滤器1=新的SingleColumnValueFilter(
ColumnFamilyName、QName1、CompareOp.GREATER、,
新的二进制比较器(Bytes.toBytes(“1000”));
过滤器。添加(过滤器1);
SingleColumnValueFilter过滤器2=新的SingleColumnValueFilter(
ColumnFamilyName,QName1,CompareOp.LESS,新的二进制比较器(
字节,以字节为单位(“5000”);
过滤器。添加(过滤器2);
过滤器列表过滤器列表=新过滤器列表(过滤器);
扫描=新扫描();
scan.setFilter(过滤器列表);
List resultRowKeys=new ArrayList();
ResultScanner ResultScanner=table.getScanner(扫描);
for(Result=resultScanner.next();Result!=null;Result=resultScanner
.next()){
add(Bytes.toString(result.getRow());
}
Util.close(结果扫描);
Assert.assertEquals(1,resultRowKeys.size());
3如果将int作为字节,则代码是错误的。
您应该使用Bytes.toBytes(int),而不是Bytes.toBytes(String)
我的测试代码已打开关于hbase有很多测试 或者您可以发布put代码,以便我们检查您是如何将数据保存到hbase的。
或者您可以调试它,检查值的格式
看看是否有帮助。我没有得到正确的结果,不确定是否有其他方法实现相同的结果,因为hbase中的大多数过滤器都是行过滤器,如何在特定列上添加过滤器以检索数据您是否将键存储为字符串的字节值或Int/Long的字节值?@Arnon-我使用HBa将所有内容存储为字节se Put Api调用add方法来存储仅允许针对列设置字节[]的值,是否有其他方法来存储Int/Long值HBase中的字节,但数字可以存储为字符或值,例如,一个可以存储为字符“1”或字节0x01(就像HBase使用增量限定符所做的那样)@Arnon是的,我知道,但如果您看到,org.apache.hadoop.hbase.client.Increment api允许添加长值列,但使用org.apache.hadoop.hbase.client.Put api无法实现相同的操作,当我尝试使用Put api添加长值时,它以\x0格式存储,但当我尝试检索它时,它将打印为未知字符。尝试过吗使用1.新的SingleColumnValueFilter(Bytes.toBytes(“TRANSACTIONS”)、Bytes.toBytes(“TRANS_ID”)、CompareFilter.CompareOp.LESS、新的BinaryComparator(Bytes.toBytes(“5000”);
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);
Put put = new Put(rowKey_ForTest);
put.add(ColumnFamilyName, QName1, Bytes.toBytes("2"));
table.put(put);
List<Filter> filters = new ArrayList<Filter>();
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(
ColumnFamilyName, QName1, CompareOp.GREATER,
new BinaryComparator(Bytes.toBytes("1000")));
filters.add(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(
ColumnFamilyName, QName1, CompareOp.LESS, new BinaryComparator(
Bytes.toBytes("5000")));
filters.add(filter2);
FilterList filterList = new FilterList(filters);
Scan scan = new Scan();
scan.setFilter(filterList);
List<String> resultRowKeys = new ArrayList<String>();
ResultScanner resultScanner = table.getScanner(scan);
for (Result result = resultScanner.next(); result != null; result = resultScanner
.next()) {
resultRowKeys.add(Bytes.toString(result.getRow()));
}
Util.close(resultScanner);
Assert.assertEquals(1, resultRowKeys.size());