2009-07-15 5 views
6

Я написал несколько базовых инструментов для группировки, поворота, объединения и подтестирования наборов данных, полученных из источников не БД (например, CSV, OLTP-системы). Методы «group by» лежат в основе большинства из них.«Группа по» и другие алгоритмы баз данных?

Однако я уверен, что большая часть работы была выполнена в создании эффективных алгоритмов группировки данных ... и я уверен, что я их не использую. И мой Google-fu полностью не смог что-то изменить.

Есть ли хорошие онлайн-источники или книги, описывающие лучшие методы создания сгруппированных данных?

Или мне нужно просто начать изучать источник MySQL или что-то подобное?

+0

Бьюсь об заклад, вы закончили оптимизацию на этом этапе, но Уэс МакКинни написал немного о том, как он подошел к группе по проблеме в своей библиотеке Pandas: http://wesmckinney.com/blog/mastering-high -Информация-данные-алгоритмы-i-group-by/ – DGrady

ответ

5

Один очень удобный способ «сгруппировать по» некоторым полем (или набором полей и выражений, но я буду использовать «поле» для простоты!) - это когда вы можете организовать просмотр результатов перед группировкой (RBG) в порядке сортировки - на самом деле вы не заботитесь о сортировке (за исключением обычного случая, в котором ORDER BY также существует и просто находится в том же поле, что и GROUP BY! -), а скорее свойство «побочного эффекта» упорядочения - все строки в RBG с одинаковым значением для поля группировки поступают сразу друг за другом, поэтому вы можете накапливать до тех пор, пока поле группировки не изменится, затем испустите/покажите результаты, накопленные до сих пор, и приступить к повторной инициализации аккумуляторов новой строкой (той, которая имеет другое значение поля группировки) - убедитесь, что «просто инициализируйте аккумуляторы» в самом начале, И «просто испускайте/отдавайте накопленные результаты» в самом конце , конечно ,

Если это не сработает, возможно, вы можете хэшировать поле группировки и использовать хеш-таблицу для результатов, накопленных для этой группы - в каждой строке в RBG хешировать поле группировки, проверить, было ли оно уже присутствовать как ключ в хэш-таблице, если не поставить его там с аккумуляторами, подходящим образом инициализированными из строки RBG, а также обновлять аккумуляторы в строке RBG. Вы просто испускаете все в конце. Проблема, конечно, в том, что вы занимаете больше памяти до конца! -)

Это два фундаментальных подхода. Вы хотите, чтобы псевдокод для каждого, BTW?

+0

Спасибо Алекс, они имеют полный смысл, и я использую первый. Знаете ли вы какие-либо хорошие источники для алгоритмов в этом пространстве? или это просто личный опыт? –

+0

Извините, это в основном личный опыт - с того момента, когда нужно было реализовать такие вещи (поверх ISAM или таких вещей, как ранний ранний bsd-db), поскольку легкие встроенные SQL-механизмы были несуществующими или очень дорогими (в настоящее время я имеют тенденцию просто использовать SQLite, когда мне нужен встроенный движок ;-). –

+0

Хорошо, Алекс, я посмотрел на SQLlite, и он выглядит хорошо. Оглядываясь назад, похоже, я реализовал это же решение на разных языках от C и Perl до VBA :) –

1

Вы должны проверить базы данных OLAP. OLAP позволяет создавать базу данных совокупностей, предназначенных для анализа в режиме «среза и кости».

Совокупные меры, такие как подсчеты, средние значения, минуты, макс, суммы и stdev, могут быть быстро проанализированы с помощью любого количества измерений с использованием базы данных OLAP.

См. this введение в OLAP на MSDN.

+0

Спасибо jn29098. Наверное, не то, что я искал, но хорошая ссылка на OLAP :) –

0

Приведите пример CSV-файла и тип требуемого результата, и я, возможно, смогу прорваться к вам в Python.

У Python есть модуль CSV и понимание списков/генераторов, которые могут помочь в таких вещах.

  • Paddy.
+0

Спасибо, Падди, я ищу больше для алгоритма, а не для конкретного решения (у меня есть). Я оптимизирую, поэтому хочу, чтобы я не делал ничего глупого :) –

Смежные вопросы