1. A computer implemented method, comprising: receiving data from a main memory, wherein the data is to be hashed into a final hash table comprising a number of groups; generating, within a cache, a first hash table comprising an aggregate hash of a first portion of the data, wherein a second portion of the data is not aggregated into the first hash table; partitioning the second portion of data into one or more of partitions, wherein the partitioning comprises determining, by an estimator, an estimate of the number of groups of the final hash table based on the second portion of data; generating, within the cache, one or more intermediate hash tables, each intermediate hash table comprising an aggregate hash of a partition of the second portion of data; aggregating the first hash table and the one or more intermediate hash tables into the final hash table, wherein prior to the aggregating, the final hash table is allocated storage size based on the estimate of the number of groups for the second portion of data and a number of groups for the first portion of data; and providing, responsive to a query, at least a portion of data of the final hash table to a computing device; wherein at least one of the receiving, generating the first hash table, partitioning, generating the one or more intermediate hash tables, aggregating, and providing are performed by one or more processors.