Быстрая группировка и агрегация огромного набора данных - PullRequest
1 голос
/ 02 июня 2011

У меня есть огромное количество данных (хранится в файле, но это не имеет значения - основная часть заключается в том, что данные не помещаются в память) - скажем, 10 9 строк записей.

Запись состоит из времени, некоторого набора ключей и данных. Ключи не уникальны.
например

keys:          data:
A | B | C |    
----------------------
1 | 2 | 3 |    10 
1 | 1 | 3 |    150
1 | 1 | 2 |    140
1 | 2 | 5 |    130
5 | 3 | 2 |    120
...

Мне нужно просмотреть все данные и отфильтровать их, используя пользовательский фильтр (это не проблема), а затем агрегировать, подсчитывать сумму и возвращать строки с самыми высокими данными.

Например, в данных я хочу суммировать каждую группировку данных по A и C.

ожидаемый результат:

A | C | data
------------
1 | 3 | 160
1 | 2 | 140
1 | 5 | 130

------------ following (data isn't in 3 highest value) doesn't concern me.
5 | 2 | 120

Я реализовал это, используя наивное решение, у меня есть Dictionary<tuple(A, C), long>, и сумма там. Но проблема в том, что в памяти может быть больше уникальных комбинаций A, C, чем я могу.

Я не могу предварительно суммировать какие-либо данные, так как может появиться какая-либо фильтрация, или использовать SQL (реляционная БД мне не подходит).

Существуют ли алгоритмы с эффективным использованием памяти, пригодные для группировки таким образом? Как SQL обрабатывает так много данных? Я могу группировать по SQL, но есть несколько причин, по которым я не хочу его использовать.

Или что мне гуглить? Я не нашел ни одной полезной статьи по этому вопросу.

(я использую C #, вопрос скорее теоретический, чем «используйте следующий код:»)

1 Ответ

1 голос
/ 02 июня 2011

ну, комментарии к вопросу могут рассматриваться как ответ ...
Вы можете использовать mapreduce ( hadoop - это реализация фреймворка в Java)
ваш map этап будет анализировать каждую строку и извлекать соответствующий ключ и значение для каждой строки.
ваш reduce этап суммирует все данные для данного ключа.

...