Поиск между датами в Hbase

У меня есть таблица Hbase с rowKeys как таковая (разделитель = '#')

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, как указано выше, но это также не дало мне правильных результатов.

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

Я хочу использовать ту же структуру ключей и добиться того, чего хочу. Это вообще возможно?


person Huga    schedule 10.12.2016    source источник
comment
ты пробовал public Scan setTimeRange(long minStamp, long maxStamp) throws IOException ? Насколько я знаю, вышеупомянутый способ не подходит для сканирования Range.   -  person Ram Ghadiyaram    schedule 11.12.2016


Ответы (1)


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

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"))));
        }
    }
}
person Ram Ghadiyaram    schedule 11.12.2016