商業智能平台:使用 MongoDB 聚合管道的教程

已發表: 2022-03-11

使用數據來回答有趣的問題是研究人員在當今數據驅動的世界中忙於做的事情。 鑑於海量數據,處理和分析數據的挑戰很大; 特別是對於沒有時間投資學習商業智能平台或 Hadoop 生態系統、Spark 或 NoSQL 數據庫提供的技術的統計學家或數據分析師,這些平台或技術將幫助他們在幾分鐘內分析 TB 級數據。

今天的規範是研究人員或統計學家在 R、MATLAB 或 Octave 等分析包中的數據子集上構建模型,然後將公式和數據處理步驟提供給 IT 團隊,然後由他們構建生產分析解決方案。

這種方法的一個問題是,如果研究人員在對生產中的所有數據運行他的模型後發現了一些新的東西,則必須重新重複該過程。

如果研究人員可以與 MongoDB 開發人員合作,對所有生產數據進行分析並將其用作他的探索性數據集,而無需學習任何新技術或複雜的編程語言,甚至 SQL,會怎樣?

MongoDB和商業智能

如果我們有效地使用 MongoDB 的聚合管道和 MEAN,我們可以在相當短的時間內實現這一目標。 通過這篇文章和這個 GitHub 存儲庫中可用的代碼,我們想展示實現這一點是多麼容易。

市場上的大多數商業智能工具都為研究人員提供了將數據集從 NoSQL 和其他大數據技術導入工具的方法,然後在工具內部完成轉換和分析。 但在本商業智能教程中,我們使用了 MongoDB 聚合管道的強大功能,而無需從 MongoDB 中提取數據,研究人員使用簡單的界面對生產大數據系統進行各種轉換。

用於商業智能的 MongoDB 聚合管道

簡單來說,MongoDB 的聚合管道是一個對數據集執行一系列數據轉換的框架。 第一階段將整個文檔集合作為輸入,然後每個後續階段將先前轉換的結果集作為輸入並產生一些轉換後的輸出。

聚合管道中可以使用 10 種類型的轉換:

  • $geoNear:按照離指定點最近到最遠的順序輸出文檔

  • $match:過濾由任何給定表達式設置的輸入記錄

  • $project:使用輸入字段或計算字段的子集創建結果集

  • $redact:根據來自文檔的信息限製文檔的內容

  • $unwind:從文檔中獲取一個包含 n 個元素的數組字段,並返回 n 個文檔,其中每個元素添加到每個文檔中作為替換該數組的字段

  • $group:按一列或多列分組並在其他列上執行聚合

  • $limit:從輸入集中挑選前 n 個文檔(用於百分位數計算等)

  • $skip:忽略輸入集中的前 n 個文檔

  • $sort:根據給定的對像對所有輸入文檔進行排序

  • $out:獲取從前一階段返回的所有文檔並將它們寫入一個集合

除了上面列表中的第一個和最後一個,沒有關於這些轉換可以應用的順序的規則。 $out 應該只使用一次,最後,如果我們想將聚合管道的結果寫入新的或現有的集合。 $geoNear 只能用作管道的第一階段。

為了讓事情更容易理解,讓我們來看看兩個數據集和與這些數據集相關的兩個問題。

不同職位的薪金差異

為了解釋 MongoDB 聚合管道的強大功能,我們下載了一個數據集,其中包含整個美國大學教學人員的工資信息。 該數據可在 nces.ed.gov 上獲得。 我們有來自 7598 家機構的數據,包括以下領域:

 var FacultySchema = mongoose.Schema({ InstitutionName : String, AvgSalaryAll : Number, AVGSalaryProfessors : Number, AVGSalaryAssociateProfessors : Number, AVGSalaryAssistantProfessors : Number, AVGSalaryLecturers : Number, AVGSalaryInstructors : Number, StreetAddress : String, City : String, State : String, ZIPCode : String, MenStaffCount : Number, WomenStaffCount : Number }

有了這些數據,我們想(平均而言)找出各州副教授和教授的工資之間的差異。 然後,副教授可以意識到他在工資方面更接近教授的價值。

要回答這個問題,研究人員首先需要從集合中剔除不良數據,因為在我們的數據集中有幾行/文檔的平均工資是空字符串或空字符串。 為了完成數據集的清理,我們將添加以下階段:

 {$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}

這將過濾掉所有在這兩個字段中具有字符串值的實體。 在 MongoDB 中,每種類型都用一個唯一的編號表示——對於字符串,類型編號是 2。

這個數據集就是一個很好的例子,因為在現實世界的數據分析中,工程師通常還必須處理數據清理。

現在我們有了一些穩定的數據,我們可以繼續下一階段,我們將按州平均工資:

 {$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}

我們只需要運行上述結果集的投影並獲得州平均工資的差異,如下面我們管道的第 3 階段所示:

 {$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}

這應該讓我們從全美 7519 家教育機構的數據集中獲得教授和副教授之間的州級平均工資差異。 為了更方便地解釋這些信息,讓我們做一個簡單的排序,以便我們通過添加 $sort 階段來知道哪個狀態的差異最小:

 {$sort: { SalaryDifference: 1}}

從這個數據集中,很明顯,愛達荷州、堪薩斯州和西弗吉尼亞州是三個州,副教授和教授的工資差異與所有其他州相比最小。

為此生成的完整聚合管道如下所示:

 [ {$match: {AVGSalaryProfessors: {$not: {$type: 2}}, AVGSalaryAssociateProfessors: {$not: {$type: 2}}}}, {$group: {_id: "$State", StateAVGSalaryProfessors: {$avg: "$AVGSalaryProfessors"}, StateAVGSalaryAssociateProfessors: {$avg: "$AVGSalaryAssociateProfessors"}}}, {$project: {_ID: 1, SalaryDifference: {$subtract: ["$StateAVGSalaryProfessors", "$StateAVGSalaryAssociateProfessors"]}}}, {$sort: { SalaryDifference: 1}} ]

顯示的結果數據集如下所示。 研究人員還可以將這些結果導出為 CSV,以便使用 Tableau 等可視化軟件包或通過簡單的 Microsoft Excel 圖表進行報告。

mongodb 數據集示例

按就業類型劃分的平均工資

我們將在本文中探討的另一個示例涉及從 www.data.gov 獲得的數據集。 鑑於美利堅合眾國所有州和地方政府組織的工資單信息,我們想計算出每個州全職和兼職“金融管理”員工的平均工資。

數據集已導入,生成 1975 個文檔,其中每個文檔都遵循以下模式:

 mongoose.Schema({ State : String, GovernmentFunction : String, FullTimeEmployees : Number, VariationPCT : Number, FullTimePay : Number, PartTimeEmployees : Number, PartTimePay : Number, PartTimeHours : Number, FullTimeEquivalentEmployment : Number, TotalEmployees : Number, TotalMarchPay : Number }, {collection: 'payroll'});

這個問題的答案可能會幫助財務管理員工選擇最好的州。 使用我們基於 MongoDB 聚合器管道的工具,這可以很容易地完成:

在第一階段,過濾 GovernmentFunction 列以丟棄所有非“金融管理”實體:

 {$match:{GovernmentFunction:'Financial Administration'}}

在教程的下一階段,我們將按州對實體進行分組,併計算每個州的平均全職和兼職工資:

 {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}

最後,我們將結果從高薪州排序到低薪州:

 {$sort: {FTP_AVG: -1, PTM_AVG: -1}}

這應該允許該工俱生成以下聚合管道:

 [ {$match:{GovernmentFunction:'Financial Administration'}}, {$group: {_id: '$State', FTP_AVG: {$avg: '$FullTimePay'}, PTM_AVG: {$avg: '$PartTimePay'}}}, {$sort: {FTP_AVG: -1, PTM_AVG: -1}} ]

運行聚合管道應該會產生如下結果:

mongodb聚合管道

建築模塊

為了構建這個商業智能應用程序,我們使用了 MEAN,它是 MongoDB、ExpressJS、AngularJS 和 NodeJS 的組合。

MEAN 商業智能

您可能已經知道,MongoDB 是一個無模式文檔數據庫。 儘管它存儲的每個文檔的大小限制為 16MB,但它的靈活性和性能以及它提供的聚合管道框架使得 MongoDB 非常適合這個工具。 得益於其全面的文檔,MongoDB 的入門非常容易。

Node.js 是 MEAN 的另一個不可或缺的組件,它提供了事件驅動的服務器端 Javascript 環境。 Node.js 使用 Google Chrome 的 V8 引擎運行 Javascript。 Node.js 的可擴展性承諾是推動許多組織走向它的原因。

Express.js 是 Node.js 最流行的 Web 應用程序框架。 它使為 Web 應用程序構建 API 或任何其他類型的服務器端業務層變得容易。 由於其極簡主義的性質,它非常快,但也非常靈活。

由許多 Google 工程師創建和維護的 AngularJS 正迅速成為可供我們使用的最流行的前端 Javascript 框架之一。

MEAN 如此受歡迎以及我們選擇 techXplorers 應用程序開發的原因有兩個:

  • 技能組很簡單。 了解 JavaScript 的工程師適合所有層級。

  • 前端到業務到數據庫層之間的通信都是通過 JSON 對象進行的,這為我們在不同層的設計和開發中節省了大量時間。

結論

在這個 MongoDB 聚合管道教程中,我們展示了一種經濟高效的方法,為研究人員提供一種工具,他們可以將生產數據用作探索性數據集,並運行不同的轉換集來分析和構建模型。

我們能夠在短短 3 天內端到端地開發和部署這個應用程序。 該應用程序由 4 名經驗豐富的工程師(2 名在美國,2 名在印度)和一名設計師和自由 UX 專家組成的團隊開發,幫助我們對界面設計提出一些想法。 在未來的某個時候,我將花時間解釋這種級別的協作如何在令人難以置信的短時間內構建出令人敬畏的產品。

我們希望您利用 MongoDB 的聚合管道,將權力交到您的研究人員手中,他們可以通過聰明的分析和洞察力改變世界。

此應用程序可在此處使用。