集算器协助MongoDB计算之交叉汇总

MongoDB实现交叉汇总比较困难,如果将数据取出,用Java等高级语言来汇总的话,也相当复杂。因此,可以考虑用集算器esProc辅助MongoDB完成交叉汇总。下面我们通过一个例子来看一下具体做法。

Student集合如下:

db.student.insert  ( {school:‘school1‘, sname : ‘Sean‘ , sub1:4, sub2 :5 })

db.student.insert  ( {school:‘school1‘, sname : ‘chris‘ , sub1:4, sub2 :3 })

db.student.insert  ( {school:‘school1‘, sname : ‘becky‘ , sub1:5, sub2 :4 })

db.student.insert  ( {school:‘school1‘, sname : ‘sam‘ , sub1: 5,sub2 :4 })

db.student.insert  ( {school:‘school2‘, sname : ‘dustin‘ , sub1:2, sub2 :2 })

db.student.insert  ( {school:‘school2‘, sname : ‘greg‘ , sub1:3, sub2 :4 })

db.student.insert  ( {school:‘school2‘, sname : ‘peter‘ , sub1:5, sub2 :1 })

db.student.insert  ( {school:‘school2‘, sname : ‘brad‘ , sub1:2, sub2 :2 })

db.student.insert  ( {school:‘school2‘, sname : ‘liz‘ , sub1: 3,sub2 :null })

希望能够统计出如下的交叉表:每行一个学校,第一列是sub1成绩为5的人数,第二例是sub1成绩为4的人数,以此类推。

集算器的脚本如下:

A1: 连接MongoDB数据库,ip和端口号是localhost:27017,数据库是test,用户名和密码都是test。

A2: 使用find函数从MongoDB中取出集合student,形成游标。esProc在find函数中采用了和mongdb的find语句一样的参数格式。esProc的游标是分批读取和处理数据,可以避免数据量过大,内存出现溢出的情况。这里数据量不大,所以用fetch函数一次取出。

A3:首先按照学校分组。

A4:学校分组之后,每组内部按照[1,2,3,4,5]的序列对齐分组,再求每一个对齐分组的长度。

A5:对A4的长度数按照需求放入相应的位置,生成结果排列。

结果如下:

需要说明的是:集算器esProc并不包含MongoDB的java驱动包。用esProc来访问MongoDB,必须提前将MongoDB的java驱动包(要求2.12.2或以上版,如mongo-java-driver-2.12.2.jar)放到[esProc安装目录]\common\jdbc中。

集算器esProc协助MongoDB计算的脚本很容易集成到java中,只要增加一行,写成resultA5即可向java输出resultset形式的结果,具体的代码参考esProc教程。同样,用java调用esProc访问MongoDB也必须将mongdb的java驱动包放到java程序的classpath中。

时间: 2024-08-29 18:40:48

集算器协助MongoDB计算之交叉汇总的相关文章

集算器协助MongoDB计算之数位比较

Mongodb脚本解决复杂问题的计算能力有限,直接使用时较为吃力.很多情况下需要将数据读出后在主程序中进一步完成运算,而在Java等高级语言中编写这类集合式运算也比较麻烦.这时可以用集算器esProc来辅助,本文通过例子来说明使用方法. Mongodb中有一个test集合如下: >db.test.find({},{"_id":0}) {"value" : NumberLong(112937552) } {"value" : NumberLo

集算器协助MongoDB计算之本地化排序

对于本地化语言(例如:中文),MongoDB是按照UNICODE编码排序,而不是根据本地语言的编码排序.用esProc结合MongoDB可以方便的实现本地化语言的排序(例如:中文按照拼音排序).下面我们以中文为例,来看一下具体做法. MongoDB中的集合person保存了姓名和性别如下: >db.person.find() {"_id" : ObjectId("544e4e070f03ad39eb2bf498"),"name" : &qu

集算器协助java处理多样性数据源之MongoDB

MongoDB不支持join,其官网上推荐的unity jdbc可以把数据取出来进行二次计算实现join运算,但这些join.group.函数.表达式等高级功能都是收费版才有,而且即使是收费版本,对子查询.窗口函数等复杂SQL运算仍不支持.其他免费的jdbc drive就只能支持最基本的SQL语句了. 用免费的esProc配合MongoDB,可以实现上述结构化(半结构化)复杂计算.这里以join为例说明一下具体作法. MongoDB中的文档orders保存了订单数据,employee保存了员工数

集算器协助java处理多样性数据源之HDFS

Java通过Hadoop提供的API访问HDFS不算困难,但针对其上文件的计算就比较麻烦.比如分组.过滤.排序等计算,用java来实现都比较复杂.集算器esproc能很好地协助java解决计算问题,同时也封装了HDFS的访问,借助esproc可以让java加强HDFS上文件的计算能力,结构化半结构化数据计算都可以轻松完成.下面我们通过例子来看一下具体作法. HDFS中的文本文件employee.gz中保存了员工数据.我们要读取员工信息,从中找出1981年1月1日(含)之后出生的女员工.文本文件在

集算器协助Java处理结构化文本之分组汇总

直接用Java实现文体文件分组汇总会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当分组.汇总表达式变化时,只能改写代码.而要实现灵活表达式的话,需要自己实现动态表达式解析和求值,编程工作量非常大. 2.遍历过程中记录分组结果,结果小了还可以存在内存中,如果分组结果太大时要将中间结果缓存进临时文件再归并,实现过程非常复杂. 使用集算器辅助Java编程,这些问题都有现成的类库可以解决.下面,我们通过例子来看一下具体作法. 文本文件employee.txt中保存有员工信息,我们要按照DEPT

集算器协助Java处理结构化文本之条件过滤

直接用Java实现文本文件中数据按条件过滤会有如下的麻烦: 1.文件不是数据库,不能用SQL访问.当过滤条件变化时需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 2.文件太大时不能一次性装入内存处理,而采用逐步读入方式在考虑到性能时又会涉及到文件缓冲区管理.拆行计算等复杂编程. 使用集算器来辅助Java编程,这些问题都不需要自己写代码解决.下面我们通过例子来看一下具体作法. 文本文件employee.txt中保存了员工数据.我们要读取员

用集算器协助Java读入文本

JAVA提供了最基本的文件处理函数,可以简单无结构的方式读入小文本文件,如果遇到需要结构化.格式多样.要求特殊的文件或内存装不下的大文件,相应的代码就会很复杂,可读性和复用性也很难保障. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和计算函数,并提供JDBC接口.JAVA应用程序可以将集算器脚本文件当做数据库存储过程执行,传入参数并用JDBC获得返回结果.详情参考集算器用作Java计算类库的应用结构. 下面说明JAVA读入文本的常见案例,以及集算器对应的解法. 读入指定列 

集算器协助Java处理多样性数据源之Hive

Java使用jdbc连接Hive比较简单,但是Hive的计算能力相对于其它数据库的SQL而言较弱,要完成非常规的计算需要将数据取出后用Java进一步计算,编程比较麻烦. 使用集算器配合Java编程,可以减少Java使用Hive时要进行复杂计算工作量.下面我们通过例子来看一下具体作法:Hive中的orders表中保存了订单的明细数据,需要计算同期比和比上期.数据如下: ORDERID CLIENT SELLERID AMOUNT ORDERDATE    1 UJRNP 17 392 2008/1

集算器协助java处理多样性数据源之JSON

Java的json开源包一般只能解析json数据,没有运算功能.程序员自己写通用的程序来实现分组.排序.过滤.连接这些计算,相当麻烦.例如:用java写json文件条件过滤程序时,当条件表达式发生变化时就需要改写代码.如果要实现象SQL那样灵活的条件过滤,则需要自己实现动态表达式解析和求值,编程工作量非常大. 集算器是支持动态表达式的,可以嵌入到Java中写出通用的json计算程序.下面我们通过例子来看一下具体作法.待处理字符串是json格式的员工信息,包含EID.NAME.SURNAME.GE