有效地组织大型数据集以进行报告

Posted

技术标签:

【中文标题】有效地组织大型数据集以进行报告【英文标题】:Organize a large-ish dataset efficiently for reporting 【发布时间】:2013-02-17 09:04:09 【问题描述】:

所以数据层次结构非常简单:

Account >> SubAccount >> Category >> Product

我需要为每个产品提取一个每日统计数据(这只是一个数字,我们称之为每日绩效)。可以有数十个帐户、数十个子帐户、数百个类别和 数百万 种产品。

让我这样做的 API 的形式是

GetCurrentPerformance(Product)

现在,在基于 Web 的仪表板中,我需要能够显示任何产品、类别、子帐户和帐户的时间与性能。如果自上次获取 GetCurrentPerformance(Product) 以来任何产品的性能发生剧烈变化(比如超过 30%),我还需要能够发出警报。

我正在云端构建这个解决方案,最好是在 AWS 上。我正在尝试决定如何最好地存储我每天获取的数据。这是我考虑过的:

    将所有内容放入数据库 (RDBMS)。担心桌子大小会以多快的速度失控。 为每个产品维护一个平面文件,将当天的表现附加到该文件中。在获取(平均)时计算类别、子帐户和帐户的统计数据,并为每个类别、子帐户和帐户维护一个文件。 关注:文件需要存储在 S3 上,S3 不支持追加。使整个拉文件、附加数据、推文件非常耗时。 为每天的数据(所有产品)维护一个文件。然后在批处理作业中,计算每个产品、类别、子帐户和帐户的统计信息。维护一个文件/数据库,以便不必为平均计算引用所有文件。 关注:要显示特定产品的时间线,需要阅读数百个文件。 No-SQL 数据库?对此没有任何经验。

这似乎是一个非常简单的问题 - 但我对如何进行的最佳方式感到困惑。建议表示赞赏。

【问题讨论】:

【参考方案1】:

如果您只关心当前与以前的性能,并且不需要任何历史性能统计信息,那么以下在 RDBMS 中可以正常工作:

create table product_performance (
  product_id integer primary key,
  current_perf number,
  previous_perf number
);

然后你可以通过执行来设置性能:

update product_performance
set    current_perf = :new_perf,
       previous_perf = current_pref
where  product_id = :product;

如果您想保持历史表现(以便您可以跟踪随时间的变化),您需要这样的东西:

create table product_performance (
  product_id integer,
  performance_date date,
  performance number,
  is_current char(1), --optional, may improve the performance of finding current perf easier
  primary key (product_id, performance_date)
);

每个新的性能值只是产品和日期的插入。

无论您使用哪种方法,最好在设置新性能时发出警报,而不是等待仪表板获取查询重新运行。

【讨论】:

感谢克里斯的详细回复!我需要保留历史性能值。我想知道使用基于 RDBMS 的解决方案是否是解决这个问题的最佳方法——因为我每天都会有数百万行。 您可以构建一个 RDBMS 解决方案来管理这个问题,只要您的查询被正确索引。如果您发现仪表板在保留历史数据时表现不佳,您可以随时在单独的表中实施这两种解决方案。

以上是关于有效地组织大型数据集以进行报告的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中订购大型时间序列数据集以进行导出

如何使用 PHP 和 MySQL 有效地对大型数据集进行分页?

优化分层数据集以读取整个层次结构

从大型数据集的数据框有效地创建矩阵

dcast 有效地使用多个变量的大型数据集

在 Javascript 中有效地逐步过滤大型数据集