根据您的描述,您的数据似乎是一个 的 时间序列数据集 强> 。 用户似乎主要关心查询时和选择时间帧后,用户将通过附加条件细化结果。
考虑到这一点,我建议你尝试一下 的 时间序列数据库 强> 喜欢 InfluxDB 要么 OpenTSD 。 例如,Influx提供了一种查询语言,能够处理如下所示的查询,这与您要实现的目标非常接近:
SELECT count(location) FROM events WHERE time > '2013-08-12 22:32:01.232' AND time < '2013-08-13' GROUP BY time(10m);
我不确定你的意思 规模 ,但时间序列数据库的设计可以快速处理大量数据点。 在推出自己的解决方案之前,我建议一定要试一试!
你有很多数据。由于您尝试解析的数据量,所有方法都需要花费大量时间。 我有两种方法可以给。 第一个是残酷的,你可能想过:
id | location | date | time | name | statistics 0 | blablabl | blab | blbl | blab | blablablab 1 | blablabl | blab | blbl | blab | blablablab ect.
有了这个,您可以轻松地解析和获取元素,它们都在同一个表中,但解析很长,表格很大。
我认为第二个更好:
Multiple tables: id | location 0 | blablabl id | date 0 | blab id | time 0 | blab id | name 0 | blab id | statistics 0 | blablablab
有了这个,您可以更快地解析(很多),获取ID,然后获取所有需要的信息。 它还允许您预先填充所有数据: 您可以按位置排序位置,按时间排序的时间,按字母排序的名称等,因为我们不关心ID的混合方式: 如果id为1 2 3或1 3 2,则没有人真正关心,如果您的数据已经在各自的表中解析,那么解析会更快。
因此,如果您使用我给出的第二种方法:在您收到数据点的那一刻,为每个列提供一个ID:
You receive: London 12/12/12 02:23:32 donut verygoodstatsblablabla You add the ID to each part of this and go parse them in their respective columns: 42 | London ==> goes with London location in the location table 42 | 12/12/12 ==> goes with 12/12/12 dates in the date table 42 | ...
有了这个,你想得到所有的伦敦数据,它们都是并排的,你只需要拿走所有的ID,并用它们获取其他数据。如果你想获取11/11/11和12/12/12之间的所有数据,它们都是并排的,你只需要拿ids等。
希望我帮忙,抱歉我的英语不好。
是否真的有可能在没有暴力的情况下以某种方式强制执行此操作?
我只熟悉关系数据库,我认为解决这个问题的唯一真正方法是使用之前建议的平面表,即将所有数据点作为单个表中的字段。我想你只需要决定如何做到这一点,以及如何优化它。
除非您必须保持100%的单一记录准确度,否则我认为问题确实需要,我们可以扔掉什么。
我认为我的方法是:
显然我打赌以这种方式量化时域是可以接受的。您可以通过按时域查询原始数据来提供交互式深入分析,但这仍然很慢。
希望这可以帮助。
标记
你应该看看Apache Flume和Hadoop http://hortonworks.com/hadoop/flume/#tutorials
水槽代理可用于捕获数据并将其聚合到HDFS中,您可以根据需要进行扩展。一旦它在HDFS中,有许多选项可视化甚至使用map reduce或elastic搜索来查看您在提供的示例中寻找的数据集。
我曾与一个销售点数据库合作,拥有数十万种产品和一万家商店(通常是周级聚合销售,但也包括收据级别的篮子分析,交叉销售等)。我建议你看看这些:
在我的实验中,ElasticSearch比微软的列存储或聚类索引表在同一硬件上的中小型查询速度快20%-50%。要具有快速响应时间,您必须具有足够的RAM以在内存中加载必要的数据结构。
我知道我缺少许多其他数据库引擎和平台,但我最熟悉这些。我也使用过Apache Spark但不是在数据聚合上下文中,而是用于分布式数学模型训练。
非规范化是解决关系数据库中的性能或可伸缩性的一种方法。 IMO拥有一些新表来保存汇总数据并将其用于报告将有助于您。
我有大量的数据通过流进来。流 以点为单位发送数据。
在这种情况下,将有多种方法来实现非规范化:
在消息达到流级别的理想情况下,将包含两个数据消息副本 location, date, time, name, statistics 尺寸,被派遣处理,一个去 OLTP (当前应用逻辑)第二个将用于 OLAP (BI)过程。 BI流程将为报告创建非规范化聚合结构。 我建议每个位置,日期组聚合数据记录。 因此,最终用户将查询不需要大量重新计算的预处理数据,具有一些可接受的不准确性。
location, date, time, name, statistics
我该如何选择合适的尺寸和/或组合 给定用户可能查询所有维度的维度 尺寸是多少?
这取决于您的应用程序逻辑。如果可能,限制用户可以为用户分配值的预定义查询(例如2015年1月1日至2015年12月1日的日期)。在更复杂的系统中,使用BI仓库上方的报告生成器将是一种选择。 我推荐 Kimball的数据仓库ETL工具包 。
您至少可以将日期和时间缩短为单个维度,并根据最小粒度预先汇总数据,例如: 1秒或1分钟的分辨率。以相同的分辨率缓存和分组输入流可能很有用,例如每秒将总计追加到数据存储区而不是为每个点更新。
名称和位置域名的变更大小和可能性是多少?他们之间有什么关系吗?你说位置可能多达200个。我在想如果name是一个非常小的集合并且不太可能改变,你可以在单个记录中保存每个名称列中的名称计数,从而减少表的规模每单位时间每个位置1行。