我目前正在处理数据处理模块, 我需要汇总多个具有聚合函数的相同记录。
例如,
如果我们有下表,
---------------------------------
| Dimension1 | Dimension2 | Sum |
---------------------------------
| A | B | 12 |
| A | B | 23 |
| B | C | 42 |
| C | B | 33 |
| C | B | 22 |
---------------------------------
汇总之后我们得到了
---------------------------------
| Dimension1 | Dimension2 | Sum |
---------------------------------
| A | B | 35 |
| B | C | 42 |
| C | B | 55 |
---------------------------------
我使用hash id将所有相同的行收集到字典数据结构中。 (如哈希地图,树等)
以下是我的c ++代码
unsigned int Record::GetHashCode()
{
unsigned int hash = 1;
for(const auto dim : *this)
{
hash = 31*hash + dim.HashCode();
}
return hash;
}
unsigned int Dimension::HashCode()
{
// Just burrowed java's hash function
// Please see https://en.wikipedia.org/wiki/Java_hashCode()
}
void Gatherer::Gather(const vector<Record>& records)
{
for(const auto& record : records)
{
if(table.find(record.GetHashCode()) == table.end())
{
// No this record in table
table[record.GetHashCode()] = record;
}
else
{
table[record.GetHashCode()]["metric"] += record["metric"];
}
}
}
是的,这是非常直截了当的,它的表现并不差,也不是超级好。
问题是在不久的将来可能需要添加更多维度。 尺寸数量将为80或更多。 我担心目前基于散列的聚会不适合大尺寸记录。
所以我正在寻找比我更好的汇总算法。
是否有纸张或其他快速汇总算法? 欢迎任何想法! 或者如果你很忙,也欢迎折腾搜索关键词!
谢谢,祝你有愉快的一天。