如何处理大型数据集以进行分析,以及列数不同的情况?

4

我正在为一个移动应用程序构建分析系统,并且在决定如何存储和处理大量数据方面遇到了一些困难。

每行将表示一个“视图”(类似于网页),并存储一些固定属性,例如用户代理和日期。此外,每个视图可能具有不同数量的额外属性,这些属性与执行的操作或内容标识符相关。

我已经查看了Amazon SimpleDb,它可以很好地处理不同数量的属性,但不支持GROUP BY,并且在计算行数时似乎表现不佳。生成一个包含30个数据点的月度图表需要对每个数据集每天进行一次查询。

MySQL可以更好地处理COUNT和GROUP修饰符,但是额外的属性需要存储在链接表中,并且需要JOIN来检索属性匹配给定值的视图,这不是非常快速的。5.1的分区功能可以帮助加速一些操作。

从我对上述系统的阅读和查询分析中得出的结论是,最终所有数据都需要聚合并存储在表中以便快速生成报告。

我在研究中是否错过了任何明显的东西?是否有比使用MySQL更好的方法?它似乎不是正确的任务,但我找不到既能处理GROUP / COUNT查询又具有灵活表结构的系统。

2个回答

1

这是一个你想要存储数据一次并反复读取的情况。此外,我认为您希望查询被预处理,而不需要在每次执行时计算。

我建议您将数据存储在CouchDB中,原因如下:

  • 它的表是无结构的
  • 它的查询是预处理的
  • 它支持map-reduce,允许您的查询处理group by
  • 它具有REST服务访问模型,可以从几乎任何处理HTTP请求的东西连接

考虑到CouchDB还很新,您可能会觉得这个建议有点超前。然而,我建议您阅读相关资料,因为我个人认为运行CouchDB数据库非常轻便和高效。比MySQL更轻量级。


CouchDB对于这个目的看起来非常有趣,特别是视图存储在磁盘上的方式! - David Snabel-Caunt
然后尝试使用MongoDB,它也具有CouchDB的所有功能,可能除了内置REST接口。 - jurka

0
保留在MySQL中:如果写入量有限/读取更常见,并且数据相对简单(即:可以预测可能的字符),则可以尝试在主表中使用文本/ blob列,该列使用逗号分隔值或键/值对进行更新,其中联接表中使用了“ AFTER INSERT / UPDATE”触发器。您将实际数据保存在一个单独的表中,因此仍然可以相对快速地搜索MAX's /特定的“额外”属性,但是检索用于“视图”之一的完整数据集将是主表中的单行,您可以使用脚本/应用程序将其拆分为单独的值,从而减轻数据库本身的大部分压力。
这种方法的缺点是加入表中更新/插入的成本巨大:每次数据更改都需要查询记录的所有相关数据,并在“正常”表中再次插入,类似于
UPDATE join_table
JOIN main_table
ON main_table.id = join_table.main_id
SET main_table.cache  = GROUP_CONCAT(CONCAT(join_table.key,'=',join_table.value) SEPARATOR ';')
WHERE join_table.main_id = 'foo' GROUP BY main_table.id`).

然而,作为分析数据,它通常会滞后一些时间,因此可能并不是每次更新都需要触发缓存更新,只需使用每日 cron 脚本填充昨天的数据即可。


抱歉,我应该让我的问题更清晰。该系统将会有大量的写入操作,每天可能会有数百万行数据。 - David Snabel-Caunt
问题是:记录是更新的还是当天静态的?此外,分析系统通常使用每隔X时间解析日志(在几乎任何情况下,仅记录到文件比任何数据库、SQL或NoSQL都要快得多),而不是“实时”的。 - Wrikken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接