我对大数据很新,我们有数百万条记录,其中包含以下数据 -
ID Timestamp Status
1. 12:00:00. ON
1. 12:00:35. Off
1. 12:01:01. ON
1. 12:10:00. Off
1. 12:11:00. On
我需要计算它关闭的总时间。这涉及数百万条记录,因此解决方案必须快速。关于我可以通过算法或查询做什么的任何想法?我认为一种方法是通过数组迭代数据,但这似乎太耗时了,我相信人们之前已经这样做了。
答案 0 :(得分:0)
您可以执行两个聚合,一个获取OFF时间戳的总和,另一个获取ON时间戳的总和(将所有内容标准化为自某个固定日期以来的秒数,尽可能选择最近的内容以避免溢出,尽管计算将是双重类型,所以你有一些喘息的空间)。然后从OFF时间戳中减去ON时间戳的总和。只要它们全部配对(每个ON都有一个OFF),这将是正确的答案。
那是因为你可以重写总和
其中'b'为OFF事件且'a'为ON事件。
要使用聚合框架执行此操作,假设您的文档格式为{_id: <id>, timestamp: <ts>, status: <'ON'|'OFF'>}
:
db.coll.aggregate({$group: {_id: '$status', total: {$sum: '$timestamp'}}})