[HADOOP] HBase“사이”필터
HADOOPHBase“사이”필터
필터 목록을 사용하여 범위가있는 행을 검색하려고하는데 성공하지 못합니다. 아래는 내 코드 스 니펫입니다.
1000에서 2000 사이의 데이터를 검색하고 싶습니다.
HTable 테이블 = 새로운 HTable (conf, "TRAN_DATA");
List<Filter> filters = new ArrayList<Filter>();
SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes("TRAN"),
Bytes.toBytes("TRAN_ID"),
CompareFilter.CompareOp.GREATER, new BinaryComparator(Bytes.toBytes("1000")));
filter1.setFilterIfMissing(true);
filters.add(filter1);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("TRAN"),
Bytes.toBytes("TRAN_ID"),
CompareFilter.CompareOp.LESS,new BinaryComparator(Bytes.toBytes("2000")));
filters.add(filter2);
FilterList filterList = new FilterList(filters);
Scan scan = new Scan();
scan.setFilter(filterList);
ResultScanner scanner1 = table.getScanner(scan);
System.out.println("Results of scan #1 - MUST_PASS_ALL:");
int n = 0;
for (Result result : scanner1) {
for (KeyValue kv : result.raw()) {
System.out.println("KV: " + kv + ", Value: "
+ Bytes.toString(kv.getValue()));
{
n++;
}
}
scanner1.close();
가능한 모든 방법으로 시도 1. SingleColumnValueFilter filter2 = 새 SingleColumnValueFilter (Bytes.toBytes ( "TRANSACTIONS"), Bytes.toBytes ( "TRANS_ID"), CompareFilter.CompareOp.LESS, 새로운 SubstringComparator ( "5000"));
해결법
-
==============================
1.FILTERLIST를 만들 때 FilterList.Operator도 지정해야합니다. 그렇지 않으면 filterlist가 여러 필터를 처리하는 방법을 모릅니다. 귀하의 경우에는 다음과 같아야합니다 :-
FILTERLIST를 만들 때 FilterList.Operator도 지정해야합니다. 그렇지 않으면 filterlist가 여러 필터를 처리하는 방법을 모릅니다. 귀하의 경우에는 다음과 같아야합니다 :-
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters);
이것이 도움이되는지보십시오.
-
==============================
2.좋아 보인다. 1000 및 2000의 바이트 []가 아닌 "1000"및 "2000"으로 지속되는지 확인하십시오.
좋아 보인다. 1000 및 2000의 바이트 []가 아닌 "1000"및 "2000"으로 지속되는지 확인하십시오.
나머지는 나에게 잘 보인다.
-
==============================
3.1 FilterList 기본 연산자는 Operator.MUST_PASS_ALL입니다. 이것에 관한 코드는 괜찮습니다. 2 hbase에 문자열을 바이트로 입력하면 선택이 잘못되었습니다. "1000"< "2"< "5000"때문에
1 FilterList 기본 연산자는 Operator.MUST_PASS_ALL입니다. 이것에 관한 코드는 괜찮습니다. 2 hbase에 문자열을 바이트로 입력하면 선택이 잘못되었습니다. "1000"< "2"< "5000"때문에
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());
3 int를 바이트로 넣으면 코드가 잘못되었습니다. Bytes.toBytes (String)가 아니라 Bytes.toBytes (int)를 사용해야합니다.
내 테스트 코드는 https://github.com/zhang-xzhi/simplehbase에 있습니다. hbase에 대한 많은 테스트가 있습니다.
또는 Put 코드를 게시하여 데이터를 hbase에 어떻게 저장했는지 확인할 수 있습니다. 또는 디버깅하여 값 형식을 확인할 수 있습니다.
도움이 될 수 있는지 확인하십시오.
from https://stackoverflow.com/questions/10429412/hbase-between-filters by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] YARN의 분산 캐시 기능 (0) | 2019.08.18 |
---|---|
[HADOOP] Java를 사용하여 hbase를 작성할 수 없음 (0) | 2019.08.17 |
[HADOOP] Windows 7 64 비트에서 Hadoop 2.7을 시작할 때 : 이름 또는 서비스를 알 수 없음 (0) | 2019.08.17 |
[HADOOP] 원사 로그를 삭제하는 방법 (0) | 2019.08.17 |
[HADOOP] 수정 된 SimpleShortestPathsVertex에서 GiraphRunner를 실행하는 ClassNotFoundException (0) | 2019.08.17 |