MOQL--面向流的统计过滤技术

    坦白讲在实现了moql以后,总想把它适用的范围写出来,却发现总也表达不清楚。原本写这个开源项目的初衷是因为在自己开发的产品中,会实时的,不断的收集各类数据。对于这些数据会对它们进行格式化、映射等实时的处理,也会有对数据进行过滤及统计分析的需求,最后还要将数据入库。对于数据的过滤与统计需求,同行都是基于数据库完成的,都是数据入库后再从库里用sql把数据查出来,统计也好,过滤也好,因为会伴随有大量的磁盘i/o操作,所以速度会比较慢。而在我接手开发设计之初(2006年)就将对数据的过滤与统计分析功能从数据库中挪了出来,变成了可以对数据进行实时统计分析计算的模块,不会有磁盘i/o的产生,效率远超竞争对手。只是在我做的产品中,数据的过滤与统计功能是分成两个模块开发的,虽然合起来兼容绝大部分常用的sql92语法,但不完善,比如不能支持多数据的联合查询、没有join操作,没有嵌套查询、没有集合(union、intersect)操作等。于是,决定做个开源来完善这个功能。虽然开发完了,却发现不知道怎么介绍这个工具库的用法。直到昨天参加了大数据技术大会,大会中提到的streamling计算的概念对于我来说即熟悉又陌生。熟悉是因为这些年我所做的产品就是在解决类似的问题,陌生是因为数据量引发了整个技术的变革。但这也已经无碍于我该如何描述moql能解决的问题领域了,moql设计之初就是用来对数据流进行实时的统计分析计算用的。虽然其运行效率不见得会很高,但其开发效率绝对够快。如:对web访问日志数据流中的客户端ip分组,同时对响应时间求和。sql语句为:select stream.client_ip client_ip, sum(stream.response_time) response_time from stream group by stream.client_ip。相关java代码如下:


DataSetMap dataSetMap  =new DataSetMapImpl();

String sql ="select stream.client_ip client_ip, sum(stream.response_time) response_time from stream group by stream.client_ip";

try {

        Selector selector = MoqlUtils.createSelector(sql);

while(...) {

dataSetMap.put("stream",  datainstream); //datainstream表示数据流传过来的数据集合以别名stream的方式放入dataSetMap

        selector.select(dataSetMap);

}

        RecordSet recordSet =  selector.getRecordSet();

        outputRecordSet(recordSet);

catch (MoqlException e) {

        e.printStackTrace();

}

以上的代码就可以实现对数据流中的数据按指定sql进行实时的统计分析了。需要了解更多详情,可以查看我博客中的关于moql的其它文档或给我留言。

你可能感兴趣的:(统计,过滤,流计算,moql)