协助 MongoDB 计算之交叉汇总

【摘要】

      交叉汇总作为数据统计的一种分类统计计算,用 MongoDB 实现比较困难,但可以利用集算器 SPL 语言来进行辅助实现。若想了解更多,请前往乾学院:协助 MongoDB 计算之交叉汇总!

 

       交叉汇总是数据统计中一种实用的分类统计计算。交叉汇总分析,又称列联表分析,是通过分析两个或两个以上变量之间的联合分布特征,来了解这些变量之间相互影响关系的一种统计分析技术。一般情况下,我们将某一变量分组后作为行,用其它变量或变量的组合作为列,形成数据库表进行统计分析。例如下面的表结构:

  成绩
学校学科12345
ASub1人数人数
Sub2人数   
BSub1人数    
Sub2人数    

如果将学科、成绩合并,则可进一步演化为:

 学科 - 成绩
学校sub1-1sub1-2sub1-5sub2-1
A人数    
B人数     

       用 MongoDB 能够比较清晰、自然地存储类似的数据,但要实现交叉汇总却比较困难。如果将数据取出,用 Java 等其它高级语言来汇总的话,也相当复杂。对于这种情况,我们可以利用集算器 SPL 语言辅助 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的人数,以此类推。

a_103png

使用集算器SPL的代码如下:

 A
1=mongo_open("mongodb://localhost:27017/local?user=test&password=test")
2=mongo_shell(A1,"student.find()").fetch()
3=A2.group(school)
4=A3.new(school:school,~.align@a(5,sub1).(~.len()):sub1,~.align@a(5,sub2).(~.len()):sub2)
5=A4.new(school,sub1(5):sub1-5,sub1(4):sub1-4,sub1(3):sub1-3,sub1(2):sub1-2,sub1(1):sub1-1,sub2(5):sub2-5,sub2(4):sub2-4,sub2(3):sub2-3,sub2(2):sub2-2,sub2(1):sub2-1)
6=mongo_close(A1)

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

A2: 使用find函数从MongoDB中取出集合student,形成游标。SPL游标能够分批读取和处理数据,可以避免数据量过大,以防内存溢出因为数据量不大,所以这里可以直接 fetch 出游标的所有记录

A3:首先按照学校分组。

a_100png

 

A4:分组之后,align函数实现每组内部按照[1,2,3,4,5]的序列对齐分组,再通过len函数求出每一个对齐分组序列的长度。

a_101png

 

A5:对A4的长度数按学科与成绩组合成列放入相应的位置,生成结果排列。

结果如下:

a_102png

A6: 关闭mongodb连接。

       简言之,SPL 先得到分组数据,用函数 align() 按成绩分组,再得到每组数量,最后按需求进行显示就行了。这样,借助 SPL 语言实现交叉汇总功能, 对 MongoDB 的用户来说就再也不是一件令人头痛的事了。

       需要说明的是:集算器SPL并不包含mongodb的java驱动包。如果要用SPL访问mongodb,必须提前将mongodb的java驱动包(例如:mongo-java-driver-3.9.1.jar)放到集算器设置的外部库目录extLib\MongoCli下。

       除了在集算器中直接计算,上述使用SPL语言协助mongodb计算的脚本也很容易集成到java中,只要增加一行,写成return A5即可向java输出resultset形式的结果,具体的代码参考SPL教程。同样,用java调用SPL访问mongodb也必须将mongdb的java驱动包放到java程序的classpath中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值