nim*_*cap 10 database etl data-warehouse summarization
我有两个表,记录正从外部源连续插入这些表.让我们说这些表保持用户交互的统计数据.当用户单击按钮时,该单击的详细信息(用户,点击时间等)将写入其中一个表.当用户将鼠标悬停在该按钮上时,会将记录添加到其他表中.
如果有很多用户经常与系统交互,那么将会生成大量数据,这些表将会大大增加.
当我想查看数据时,我希望以小时或每日分辨率查看数据.
是否有一种方法或最佳实践可以按要求的分辨率逐步(按数据收集)连续汇总数据?
或者有更好的方法解决这类问题吗?
PS.到目前为止我发现的是像Talend这样的ETL工具可以让生活更轻松.
更新:我目前正在使用MySQL,但我想知道无论数据库,环境等最佳实践.
在低延迟数据仓库应用程序上执行此操作的常规方法是使分区表具有包含可以快速更新的内容的前导分区(即,无需动态重新计算聚合),但使用后续分区回填聚合.换句话说,前导分区可以使用与尾随分区不同的存储方案.
大多数商业和一些开源RDBMS平台(例如PostgreSQL)可以支持分区表,这些表可以用来做这种或那种类型的事情.如何从日志中填充数据库作为读者的练习.
基本上,这种系统的结构如下:
您有一个在某种日期或日期时间值上划分的表,按小时,日或任何适当的谷物分区.日志条目将附加到此表.
当时间窗口滑出分区时,定期作业会对其进行索引或汇总,并将其转换为"冻结"状态.例如,Oracle上的作业可能会在该分区上创建位图索引,或者更新实体化视图以包含该分区的摘要数据.
稍后,您可以删除旧数据,汇总数据或将分区合并在一起.
随着时间的推移,周期性作业返回填充前沿分区.历史数据将转换为适合高性能统计查询的格式,同时前端分区易于快速更新.由于此分区没有这么多数据,因此查询整个数据集的速度相对较快.
这个过程的确切性质因DBMS平台而异.
例如,SQL Server上的表分区并不是那么好,但可以使用Analysis Services(Microsoft与SQL Server捆绑的OLAP服务器)完成此操作.这可以通过配置领先的分区纯ROLAP(OLAP服务器只需发出对底层数据库查询),然后重建尾随分区为MOLAP完成(OLAP服务器构建自己的专用数据结构,包括被称为"聚合"持久摘要).分析服务可以完全透明地对用户执行此操作.它可以在后台重建分区,而旧的ROLAP分区仍然可供用户看到.一旦构建完成,它就会在分区中交换; 多维数据集一直可用,不会中断对用户的服务.
Oracle允许独立更新分区结构,因此可以构建索引,或者在物化视图上构建分区.通过Query重写,Oracle中的查询优化器可以计算出从基本事实表计算的聚合数据可以从物化视图中获得.该查询将从物化视图中读取可用分区的聚合数据,并从前端分区读取它们不是.
PostgreSQL可能会做类似的事情,但我从来没有考虑过在它上面实现这种类型的系统.
如果您可以忍受周期性中断,可以通过进行摘要并设置前导和尾随数据的视图来明确地完成类似的操作.这允许在不支持透明分区的系统上完成此类分析.但是,随着视图的重建,系统将暂时中断,因此您无法在工作时间执行此操作 - 最常见的是在一夜之间.
编辑:根据日志文件的格式或可用的日志记录选项,有多种方法可以将数据加载到系统中.一些选项是:
使用您喜欢的读取数据的编程语言编写脚本,解析相关位并将其插入数据库.这可能会经常运行,但您必须有一些方法来跟踪您在文件中的位置.小心锁定,特别是在Windows上.Unix/Linux上的默认文件锁定语义允许你这样做(这是tail -f有效的)但Windows上的默认行为是不同的; 必须编写两个系统才能很好地相互配合.
在unix-oid系统上,您可以将日志写入管道,并具有类似于从管道读取的过程.这将具有最低的延迟,但阅读器中的故障可能会阻止您的应用程序.
为应用程序编写一个直接填充数据库的日志记录界面,而不是写出日志文件.
使用数据库的批量加载API(大多数(如果不是全部都有这种类型的API可用)并批量加载日志记录数据.将类似的程序写入第一个选项,但使用批量加载API.这比使用逐行填充更少的资源,但设置批量加载的开销更大.它适用于较不频繁的负载(可能是每小时或每天),并且对整个系统施加较小的压力.
在大多数情况下,跟踪你去过的地方会成为一个问题.轮询文件以发现更改可能是不可能的昂贵,因此您可能需要设置记录器,以便它以与日志阅读器良好匹配的方式工作.
一种选择是更改记录器,以便每个周期(比如每隔几分钟)开始写入不同的文件.让您的日志阅读器定期启动并加载尚未处理的新文件.阅读旧文件.为此,文件的命名方案应基于时间,以便读者知道要拾取哪个文件.处理应用程序仍在使用的文件更加繁琐(然后您需要跟踪已读取的内容),因此您只想在最后一段时间内读取文件.
另一种选择是移动文件然后读取它.这对于行为类似Unix的文件系统最有效,但应该适用于NTFS.你移动文件,然后在leasure阅读它.但是,它需要记录器以创建/附加模式打开文件,写入然后关闭它 - 不要保持打开和锁定.这绝对是Unix的行为 - 移动操作必须是原子的.在Windows上,您可能必须站在记录器上才能完成这项工作.