2016-12-10 4 views
1

У меня HBase таблица Атмосферостойких rowKeys как таковые (delimter = «#»)При поиске между датами в Hbase

0CE5C485#1481400000#A#B#C#T 
00C6F485#1481600000#F#J#C#G 
065ED485#1481500000#T#X#C#G 
... 
... 

Первая часть на самом деле гекс из метки времени обращенно (вторая частью является временной меткой). У меня был этот формат rowkey, чтобы я мог разделить ключ на разные регионы равномерно. В моих регионах есть расколы, основанные на первых двух символах rowKey ('00', '01', ..., 'FE', 'FF'). 256 в целом

Есть ли способ получить все строки между двумя временными метками без переопределения метки времени в значении?

I tried RegexComparators on top of Row Filters 
e.g. 
FilterList f = new FilterList(FilterList.Operator.MUST_PASS_ALL) 
Filter f1 = new RowFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL,new RegexComparator(".*1481400000") 
Filter f2 = new RowFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new RegexComparator(".*1481600000") 

f.add(f1) 
f.add(f2) 

И это дало мне неправильные результаты. Я попытался использовать SubStringFilter, как и выше, но также не смог дать правильные результаты.

Вышеприведенный пример является только примером, который я написал для вопроса, но, надеюсь, вы понимаете проблему, которую я имею под рукой.

Я хочу использовать ту же ключевую структуру и достичь того, чего хочу. Возможно ли это?

+0

вы пробовали 'общественного сканирования setTimeRange (длинный minStamp, долго maxStamp) бросает IOException'? AFAIK, вышеупомянутый путь не подходит для сканирования диапазона. –

ответ

2

Я предлагаю фильтр диапазона времени.

import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.client.*; 
import org.apache.hadoop.hbase.util.Bytes; 
import java.io.IOException; 

public class test { 
    public static void main (String[] args) throws IOException { 
     HTable table = new HTable(HBaseConfiguration.create(), "t1"); 
     Scan s = new Scan(); 
     s.setMaxVersions(1); 
// you can use time range filter sfor 
     s.setTimeRange (1481400000L, 1481600000L); 
     ResultScanner scanner = table.getScanner(s); 
     for (Result rr = scanner.next(); rr != null; rr = scanner.next()) { 
      System.out.println(Bytes.toString(rr.getRow()) + " => " + 
        Bytes.toString(rr.getValue(Bytes.toBytes("f1"), Bytes.toBytes("a")))); 
     } 
    } 
} 
Смежные вопросы