我在使用过滤器搜索hbase中的数据时遇到问题。
首先,我从一个表中读取一些数据并存储在vector或arrayList中:
for (Result r : rs) {
for (KeyValue kv : r.raw()) {
if (new String(kv.getFamily()).equals("mpnum")) {
temp = new String(kv.getValue());
x.addElement(temp);
}
}
}
然后,我想根据此向量的值搜索不同的表。我使用过滤器执行此操作:(我也尝试了BinaryPrefixComparator
和BinaryComparator
)
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
for (int c = 0; c < x.size(); c++) {
System.out.println(x.get(c).toString());
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("mpnum"), null, CompareOp.EQUAL, new SubstringComparator( x.get(c).toString() )));
}
我应该得到3个结果,但是我只得到一个结果,这是数据库中的第一个条目。 没有意义的是,当我将我正在寻找的值硬编码到我的代码中时,我将得到所有3个结果。
我认为将字节转换为String然后再转换为字节可能存在一些问题,但这并不能解释它是如何将第一个结果带回来的。出于某种原因,它在第一场比赛时停止,并且不会继续查找包含匹配数据的其他2行。如果我硬编码,我会得到结果:
x.addElement("abc123");
filterList.addFilter(new SingleColumnValueFilter(Bytes.toBytes("mpnum"), null, CompareOp.EQUAL, new SubstringComparator( x.get(0).toString() )));
有谁知道问题是什么或我需要做些什么来解决我的问题?非常感谢您的帮助。
谢谢
编辑:这是表格的内容:
TABLE1:
ROW COLUMN + CELL
0列= gpnum:,时间戳= 1481300288449,值= def123
0列= mpnum:,时间戳= 1481300273355,值= abc123
0列=价格:,时间戳= 1481300255337,值= 85.0
1列= gpnum :,时间戳= 1481301599999,值= def2244
1列= mpnum:,时间戳= 1481301582336,值= 011511607
1列=价格:,时间戳= 1481301673886,值= 0.76
TABLE2
ROW COLUMN + CELL
0列=品牌:,时间戳= 1481300227283,值= x
0列= mpnum:,时间戳= 1481300212289,值= abc123
0列=价格:,时间戳= 1481300110950,值= 50.0
1列= mpnum:,时间戳= 1481301806687,值= 011511607
1列=价格:,时间戳= 1481301777345,值= 1.81
13列= webtype :,时间戳= 1483507543878,值= US
3列= avail:,timestamp = 1481306538360,value = avail
3栏=品牌:,时间戳= 1481306538360,价值=品牌
3列= descr:,时间戳= 1481306538360,值=描述
3列= dist:,时间戳= 1481306538360,值=分配器
3列= mpnum:,时间戳= 1481306538360,值= pnum
3列=价格:,时间戳= 1481306538360,价值=价格
3列= url:,时间戳= 1481306538360,值= url
3列= webtype:,timestamp = 1481306538360,value = webtype
4列= avail :,时间戳= 1481306538374,值= 4
4列=品牌:,时间戳= 1481306538374,值= x
4列= descr:,时间戳= 1481306538374,值=描述
4列= dist:,时间戳= 1481306538374,值= x
4列= mpnum:,时间戳= 1482117383212,值= 011511607
4列=价格:,时间戳= 1481306538374,值= 34.51
4列= url:,时间戳= 1481306538374,值= x
4列= webtype:,timestamp = 1481306538374,value = US
5列= avail:,timestamp = 1481306538378,value =
5列=品牌:,时间戳= 1481306538378,值=名称
5列= descr:,时间戳= 1481306538378,值= x
5列= dist:,时间戳= 1481306538378,值= x
5列= mpnum:,时间戳= 1482117392043,值= 011511607
5列=价格:,时间戳= 1481306538378,值= 321.412
5列=网址:,时间戳= 1481306538378,值= x.com
THIRD TABLE(存储结果匹配)
0 column = brand:,timestamp = 1481301813849,value = name
0列= cprice :,时间戳= 1481301813849,值= 1.81
0列= gpnum:,时间戳= 1481301813849,值= def2244
0列= gprice :,时间戳= 1481301813849,值= 0.76
0列= mpnum:,时间戳= 1481301813849,值= 011511607
**应该是上面以粗体显示的三个匹配,但只返回一个匹配
如果有人愿意为您付费,请发送电子邮件至tt224416@gmail.com