HBase

2012-11-14 25 views
6

'daki bir satıra birkaç QualifierFilter nasıl uygulanır, biz iki QualifierFilters içeren bir HBase tablosundaki bir taramayı filtrelemek isteriz. Yalnızca belirli bir sütun olan 'col_A' AND (!) Belirli bir sütun 'col_B' olan tablonun satırlarını almak istediğimiz anlamına gelir.HBase

Mevcut yaklaşım şuna benzer: Her iki sütun 'col_A' ve 'col_B' var HBase tabloda birkaç satır olmasına rağmen

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); 
Filter filter1 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_A".getBytes())); 
filterList.addFilter(filter1); 
Filter filter2 = new QualifierFilter(CompareOp.EQUAL, new BinaryComparator("col_B".getBytes())); 
filterList.addFilter(filter2); 

Scan scan = new Scan(); 
scan.setFilter(filterList); 
... 

ResultScanner bu taramadan herhangi bir sonuç vermez.

Yalnızca filtrelere 1 filtre uygularsak, her şey düzgün çalışıyorsa, 'col_A' olan tüm satırları elde ederiz. Sadece filtreyi 2 taramaya uyguluyorsak, aynıdır. 'Col_B' olan tüm satırları alırız.

Yalnızca bu iki filtreyi birleştirirsek, hiçbir sonuç elde edemeyiz.

Sadece col_A AND col_B olan tablodaki satırları almanın doğru yolu ne olurdu?

cevap

3

aşağıdaki filtreleri tanımlayarak bunu başarabilirsiniz:

List<Filter> filters = new ArrayList<Filter>(2); 
byte[] colfam = Bytes.toBytes("c"); 
byte[] fakeValue = Bytes.toBytes("DOESNOTEXIST"); 
byte[] colA = Bytes.toBytes("col_A"); 
byte[] colB = Bytes.toBytes("col_B"); 

SingleColumnValueFilter filter1 = 
    new SingleColumnValueFilter(colfam, colA , CompareOp.NOT_EQUAL, fakeValue); 
filter1.setFilterIfMissing(true); 
filters.add(filter1); 

SingleColumnValueFilter filter2 = 
    new SingleColumnValueFilter(colfam, colB, CompareOp.NOT_EQUAL, fakeValue);   
filter2.setFilterIfMissing(true); 
filters.add(filter2); 

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); 
Scan scan = new Scan(); 
scan.setFilter(filterList); 

buradaki fikir sahte değeri ve bir CompareOp.NOT_EQUAL operatörü ile aradığınız Sütun başına bir SingleColumnValueFilter, her tanımlamaktır. I.e: böyle bir SingleColumnValueFilter, belirli bir ad için tüm sütunları döndürür.

Kaynak: http://mapredit.blogspot.com/2012/05/using-filters-in-hbase-to-match-two.html

+0

Yanıt için teşekkürler. Sadece denedim ve davamız için çalışıyor. Ama soru performansla ilgili. Filtrelerin FilterList'e yerleştirildiklerinde sırayla değerlendirildiğini kabul ediyorum. Yani eğer col_A'nın var olduğu birçok satır varsa, HBase bu sütundaki gerçek değerleri kontrol etmelidir. Bu oldukça pahalı geliyor. Gerçek hücre değerleri kontrol edilmeden önce her iki sütunun varlığını ilk değerlendirmek için herhangi bir yolu var mı? – Henrik

+0

@Henrik Ne kadar veri olduğunu bilmiyorum ama korkarım haklısın. Başka bir seçenek, aradığınız niteleyici listesini alan özel bir filtrenin uygulanmasıdır. –

1

bu hat sorunu olduğunu düşünüyorum - Sen olmak istiyorum

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL); 

-

FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE); 

filtre hem sahip bir sütunu bulmaya çalışacağız

sütun niteleyicisi ve böyle bir sütun yok

+0

[StackOverflow] 'a hoş geldiniz (http://stackoverflow.com/about)! Cevaplarınız (a) orijinal posterin memnuniyetine halihazırda cevap verilmediğinde veya (b) problemi sunmak için alternatif bir çözümünüz olduğunda, en çok takdir edilecektir. Ayrıca, maksimum okunabilirlik için yanıtlarınızı nasıl biçimlendireceğiniz hakkında daha fazla bilgi edinmek için lütfen yanıtınızı oluştururken "yardım" bağlantısını kontrol edin. – dg99