1. Если вы не знаете, что период агрегации будет или, если вам не нужно в реальном времени вы можете просто сканировать таблицу и агрегировать его на стороне клиента (для маленьких маленьких наборов данных) , В случае, если ваш набор данных огромен (это должно быть, если вы используете HBase), вам нужно настроить снимок карты, чтобы использовать распараллеливание (или использовать HIVE).
http://hbase.apache.org/book/mapreduce.example.html
2. Если вам нужно работа реального времени следует рассмотреть возможность реализации счетчиков предварительной подготовки к доению агрегированных данных, на основе интервала вам нужно.
Введение счетчиков: http://my.safaribooksonline.com/book/databases/database-design/9781449314682/counters/id3238520
Сохранение данных:
Подумайте об этом виде ключей строк (позволяет бесконечное число различных EventTypes):
- 8 байт ключ Sharding: несколько как substr (md5 (EventType), 0,8)
- 4 байта POSIX временная метка для 00:00:00 дня (Integer.MAX_NUMBER - временная метка чтобы сначала написать новые строки).
На основании этого вы можете иметь 25 столбцов (по одному на каждый час + один на весь день) и дать всей семье TTL 3 месяца (для обрезки старых данных). Таким образом, вы можете просто увеличить счетчик для общего столбца + столбца, который хранит этот интервал.
Хотя есть другие варианты (например, включая день как часть столбца), эта модель является очень гибкой и мощной и отлично подходит для меня.
запрашивающая данные:
- Чтобы запросить данные для интервала известного события, вы просто должны сделать запрос GET.
- Чтобы запросить последние X дней для одного известного события, вам нужно будет выполнить сканирование с помощью стартовых ключей &, которые будут очень быстрыми. Каждая строка будет иметь общий столбец и почасовые столбцы.
Недостатки:
- Предварительно агрегации с помощью счетчиков требуется 1 + 1 GET PUT, который является более дорогим, чем просто ставит.
- Вы получите очень горячие регионы, если у вас есть много приращений для одного и того же типа событий. В этом случае будет намного лучше хранить в памяти счетчики (как атомные переменные) и сбрасывать их на HBase каждые X секунд.