協助 MongoDB 計算之交叉彙總

【摘要】

      交叉彙總作爲數據統計的一種分類統計計算,用 MongoDB 實現比較困難,但可以利用集算器 SPL 語言來進行輔助實現。

交叉彙總是數據統計中一種實用的分類統計計算。交叉彙總分析,又稱列聯表分析,是通過分析兩個或兩個以上變量之間的聯合分佈特徵,來了解這些變量之間相互影響關係的一種統計分析技術。一般情況下,我們將某一變量分組後作爲行,用其它變量或變量的組合作爲列,形成數據庫表進行統計分析。例如下面的表結構:



成績
學校學科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中。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章