數據分析編程第六步:大數據運算

6.1 數據介紹

直接打開集算器運行 createEventsAndUsers.splx 文件,就可以得到如下兩張表(也可以根據代碼中的注釋,修改起止日期以及每天的數據量):

電商數據表 events.csv

字段名含義
eventID事件編號, 從 1 開始流水號
userID用戶編號
eTime事件的發生時間
eType事件類型,取值 login,viewProduct,placeOrder,completePayment

數據同時按 eTime 和 eventID 分別有序,因為數據是按發生時間追加的,所以始終按 eTime 有序,又 eventID 是流水號,所以也是天然有序

用戶表 user.csv

字段名含義
userID用戶編號,從 1 開始流水號
userName用戶姓名
city所在城市

表間關系:

imagepng

6.2 選出 24 年國慶假期發生的所有記錄

由于事件表很大,全內存無法放下,所以采用游標的方式,SPL 提供了文件游標,可以對著游標進行過濾、分組、匯總等各種運算。

A
1=file(“events.csv”).iselect@tc(date("2024-10-01"):datetime("2024-10-07 23:59:59"),eTime ; userID,eTime,eType)

A1 由于事件表按時間有序,所以采用 iselect 函數,直接對著數據文件按時間過濾,這樣可以采用二分法,提高讀數的效率,不滿足過濾條件的數據直接跳過不讀了。

分號前面的參數date("2024-10-01"):datetime("2024-10-07 23:59:59"),eTime表示選出 eTime 的值位于區間date("2024-10-01"):datetime("2024-10-07 23:59:59")之間的數據,兩端均是閉區間。

分號后面的參數userID,eTime,eType表示選出字段,不需要用到的字段不選出,可以節約內存。iselect 函數返回結果是游標,可以直接進行下一步的運算,如果需要輸出數據,可以 fetch 操作。

A1 的運行結果:

從上圖可以看出,A1 返回的結果是個游標。

6.3 統計 24 年國慶假期發生的記錄數、用戶數

A
1=file(“events.csv”).iselect@tc(date(“2024-10-01”):datetime(“2024-10-07 23:59:59”),eTime ; userID,eTime,eType)
2=A1.groups(; count(1):records,icount(userID):userNum)

A2 分組匯總,groups 函數可以直接對著游標操作,返回統計結果。特別注意:分號前面不寫分組表達式,表示全集匯總。

A2 的運行結果如下:

6.4 按事件類型分組統計 24 年國慶假期的發生次數和用戶數

A
1=file(“events.csv”).iselect@tc(date(“2024-10-01”):datetime(“2024-10-07 23:59:59”),eTime;userID,eTime,eType)
2=A1.groups(eType;count(1):records,icount(userID):userNum)

A2 的運行結果如下:

6.5 統計 24 年國慶假期每天的總用戶數、下單用戶數、付款用戶數

A
1=file(“events.csv”).iselect@tc(date(“2024-10-01”):datetime(“2024-10-07 23:59:59”),eTime;userID,eTime,eType)
2=A1.group(date(eTime):Date; ~.icount(userID):TotalNum, ~.select(eType==“placeOrder”).icount(userID):OrderNum, ~.select(eType==“completePayment”).icount(userID):PayNum)
3=A2.fetch()

A2 對著游標 A1 進行分組,group 函數表示分組過程中保留分組的組集;~.icount(userID) 表達式中的 ~ 表示當前的組集,整個表達式意思是對著當前組集統計 userID 的去重個數;~.select(eType==“placeOrder”).icount(userID) 表示對著當前組集先過濾出 eType 為 placeOrder 的記錄,再對其統計 userID 的去重個數。

cs.group 函數的返回結果依舊是游標,A2 的運行結果如下:

A3 從游標 A2 中讀出結果數據。

A3 的運行結果如下:

6.6 按天統計 24 年國慶假期北京地區的下單用戶數

A
1=file(“events.csv”).iselect@tc(date(“2024-10-01”):datetime(“2024-10-07 23:59:59”),eTime;userID,eTime,eType)
2=file(“user.csv”).cursor@tc(userID,city).select(city==“Beijing”).fetch()
3=A1.select(eType==“placeOrder”).join@i(userID,A2:userID)
4=A3.groups(date(eTime):Date;icount(userID):userNum)

A2 用戶表數據量也非常大,本例只需要讀取北京地區的用戶,因此可以用游標的方式過濾后再 fetch(),這樣非北京地區的用戶數據就不會占用內存了。

A3 將 A1 先過濾出下單的數據,然后和 A2 關聯,@i選項表示只保留關聯上的記錄,關聯不上的記錄直接刪除(如果希望只保留關聯不上的記錄,刪除關聯上的記錄,比如統計非北京地區的用戶,那么可以把@i選項換成@d選項,其余不變即可)。因為 A1 是游標,所以 A3 的返回結果依舊是游標。

A4 將 A3 進行分組匯總。

A4 的運行結果:

知識點:先過濾后關聯

上例的 A3 中關聯的兩個對象都是先分別進行了過濾,然后才進行關聯,這樣可以減少關聯的次數,提升關聯效率。

6.7 將事件表拆成一個月一張表,表內按 userID 排序

由于事件表數據量大,無法全內存放下,因此需要用游標排序:

A
1=file(“events.csv”).iselect@tc(date(“2024-10-01”):datetime(“2024-10-31 23:59:59”),eTime).sortx(userID)
2=file(“events202410.csv”).export@tc(A1)
3=file(“events.csv”).iselect@tc(date(“2024-11-01”):datetime(“2024-11-30 23:59:59”),eTime).sortx(userID)
4=file(“events202411.csv”).export@tc(A3)
5=file(“events.csv”).iselect@tc(date(“2024-12-01”):datetime(“2024-12-31 23:59:59”),eTime).sortx(userID)
6=file(“events202412.csv”).export@tc(A5)

A1 sortx 函數專門用于游標排序,參數 userID 是排序字段。sortx 返回值依舊是游標。

A2 將游標 A1 中的數據讀出直接寫入文件 events202410.csv。export 和 import 的選項規則一致,是 import 函數的逆操作。

知識點:sort 函數和 sortx 函數的區別

1.sort 函數

特點

  • 立即執行:調用sort時會直接對當前序表(或排列)進行排序,生成一個新的有序結果。
  • 內存排序:數據在內存中完成排序,適合處理中小規模數據
  • 返回新序列:原序列不變,返回排序后的新序列。

適用場景

數據量較小(可完全裝入內存),且需要直接獲取排序結果的場景。

2.sortx 函數

特點

  • 立即執行:排序結果存入一個或多個臨時文件,返回這些文件的歸并游標。
  • 外存排序:支持大數據量的排序,通過臨時外存文件處理超出內存的數據。
  • 返回游標:返回排序結果的游標,適合下一步的輸出或運算。

適用場景:

數據量較大(無法完全裝入內存),或需要與其他延遲計算操作(如流式處理)結合時。

6.8 按用戶統計每月的下單個數

需完成如下統計:

  1. 10 月下單的用戶,10 月、11 月下單的個數

  2. 10 月 11 月均下單的用戶,10 月、11 月下單的個數

  3. 按用戶統計 10 月 11 月下單個數

第一步:產生游標

A
1=file(“events202410.csv”).cursor@tc()
2=file(“events202411.csv”).cursor@tc()

第二步:分別匯總統計訂單數

A
3=A1.select(eType==“placeOrder”).group(userID;~.count(1):10Num)
4=A2.select(eType==“placeOrder”).group(userID;~.count(1):11Num)

A3 由于 A1 是游標,因此,select 函數返回的是游標,group 函數返回的依舊是游標。

第三步:關聯

1. 10 月下單的用戶,10 月、11 月下單的個數

A
5=joinx@1(A3:oct,userID;A4:nov,userID)
6=A5.new(oct.userID,oct.10Num,nov.11Num)
7=file(“result.csv”).export@tc(A6)

A5 joinx@1 為左連接,joinx 函數專門用于兩個或多個游標之間的關聯,要求參與關聯的游標數據均按關聯字段有序。參數規則和 join() 一致。

A6 因為 joinx 和 join 一樣,關聯的結果是指引字段,所以需要再次 new,產生結果序表,此時 A6 依舊是游標

A7 將結果輸出到文件,由于結果集太大內存依舊放不下,因此可以直接將游標中的數據輸出到文件。

2. 10 月 11 月均下單的用戶,10 月、11 月下單的個數

A
5=joinx(A3:oct,userID;A4:nov,userID)
6=A5.new(oct.userID,oct.10Num,nov.11Num)
7=file(“result.csv”).export@tc(A6)

A5 joinx 為內連接。

3. 按用戶統計 10 月 11 月下單個數

A
5=joinx@f(A3:oct,userID;A4:nov,userID)
6=A5.new(oct.userID,oct.10Num,nov.11Num)
7=file(“result.csv”).export@tc(A6)

A5 joinx@f 為全連接。

知識點: join()函數和 joinx() 函數的區別

1.join() 函數

特點

  • 立即執行: 調用 join() 時會直接執行連接操作,生成一個新的結果序表。
  • 內存連接: 數據在內存中完成連接,適合中小規模數據。
  • 返回完整結果: 連接后的數據會完全加載到內存中。
  • 語法靈活: 支持多種連接類型(如內連接、左連接、全連接等)。
  • 數據可以無序: 不要求數據按關聯字段有序。

適用場景

  • 數據量較小(可完全裝入內存)。
  • 需要立即獲取連接結果的場景。

2.joinx() 函數

特點

  • 延遲執行: joinx() 僅生成一個連接游標,不會立即計算,實際連接操作會延遲到后續遍歷或聚合時觸發。
  • 外存連接: 支持大數據量的連接,可處理超出內存的數據。
  • 惰性求值: 適合流式處理,可與其他函數(如 groups、select)結合使用。
  • 返回游標: 不直接返回完整數據,而是返回一個可迭代的游標對象。
  • 數據有序: 要求數據按關聯字段有序。

適用場景

  • 數據量較大(無法完全裝入內存)。
  • 需要與其他延遲計算操作(如流式處理)結合時。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94794.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94794.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94794.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue2+elementui 表格單元格增加背景色,根據每列數據的大小 顏色依次變淺顯示2

注意: 正數前5和負數后5的顏色是固定的,剩下5之后的數據顏色是根據第5個顏色依次變淺的; 封裝的js方法: /*** 最終版表格顏色處理器* param {Array} data 完整表格數據* param {String} field 當前字段名* param {Object} row 當前…

【AOSP】Android Dump 開發與調試指南

在 Android 系統開發與調試中,dump 是一個不可或缺的強大工具。它能夠提供關于系統服務、應用程序狀態以及底層硬件信息的詳細快照。對于希望深入了解 Android 系統內部工作原理、排查復雜問題或進行性能優化的開發者來說,掌握 dump 的使用至關重要。一、…

Qt數據結構與編碼技巧全解析

文章目錄Qt中的數據結構QDebugqDebug函數QT的內置類型一般都會重載 << 運算符QT的幾何規則QString 字符串編碼變長 VS 定長QString 適合中轉數據嗎&#xff1f;Qstring 的底層使用寫時復制QString的具體使用QString 的構造函數格式化構造數值轉化為字符串字符串轉成數值增…

Ubuntu操作系統下MySQL、MongoDB、Redis

在開發和運維過程中&#xff0c;經常需要從Windows客戶端遠程連接到Ubuntu服務器上的數據庫。本文將詳細介紹如何在Ubuntu操作系統下安裝和配置MySQL、MongoDB和Redis&#xff0c;以允許從Windows客戶端進行遠程連接&#xff0c;并提供詳細的遠程連接命令和配置說明。一、MySQL…

校園勤工儉學微信小程序的設計與實現:基于數字化服務生態的賦能體系構建

在高等教育普及化與數字化校園建設的雙重驅動下&#xff0c;傳統校園勤工儉學管理模式正面臨深刻變革。當前高校勤工儉學工作普遍存在崗位匹配效率低下、過程管理粗放、數據孤島嚴重等痛點——根據教育部全國學生資助管理中心2022年統計數據&#xff0c;全國普通高校共有約450萬…

Apisix工作流程

是的,你的理解基本正確:當請求到達APISIX時,它會先根據請求的URI、Host、請求方法、 headers等信息匹配最合適的路由,然后執行路由關聯的插件邏輯,最后轉發到路由配置的上游服務。下面詳細講解APISIX處理請求的全鏈路及可能的情況。 一、請求全鏈路流程 APISIX處理請求的…

InnoDB存儲引擎底層拆解:從頁、事務到鎖,如何撐起MySQL數據庫高效運轉(上)

目錄 Page頁** B樹查詢 如何加快記錄的查詢&#xff1f; 索引** 聚簇索引(主鍵) 二級索引(非主鍵) 聯合索引——多列 bufferPool* Free鏈表 flush鏈表 Flush鏈表刷新方式有如下兩種&#xff1a; LRU鏈表 針對LRU鏈表方案缺點的優化 redoLog* redo簡單日志類型 redo復雜日志類型…

【人工智能99問】GPT4的原理是什么?(32/99)

【人工智能99問】GPT4的原理是什么&#xff1f;(32/99) 文章目錄GPT-4簡介一、結構與原理二、使用場景三、優缺點分析四、訓練技巧與關鍵改進五、示例說明六、總結GPT-4簡介 一、結構與原理 1. 架構設計 GPT-4基于Transformer解碼器架構&#xff0c;核心改進包括&#xff1a;…

//Q是一個隊列,S是一個空棧,實現將隊列中的元素逆置的算法。

#include<stdio.h> #include<stdbool.h> #include<stdlib.h> #define Size 6 typedef struct SqNode//隊列結點 {int data;struct SqNode* next; }LinkNode; typedef struct SqQueue//隊列 {LinkNode* front, * rear; //頭指針和尾指針 }LinkQueue; typedef …

畢馬威 —— 公眾對人工智能的信任、態度及使用情況調查

文章目錄 前言 一、背景介紹 二、對人工智能的信任與接受度 三、人工智能的使用與認知情況 四、人工智能的益處與風險 五、人工智能的監管與治理 六、工作場所的人工智能應用 七、人工智能對工作的影響 八、學生對人工智能的應用 九、核心啟示 1.新興經濟體在公眾與員工人工智能…

基于Spring Session + Redis + JWT的單點登錄實現

實現思路 用戶訪問受保護資源時&#xff0c;若未認證則重定向到認證中心認證中心驗證用戶身份&#xff0c;生成JWT令牌并存儲到Redis認證中心重定向回原應用并攜帶令牌應用驗證JWT有效性并從Redis獲取會話信息用戶在其他應用訪問時&#xff0c;通過相同機制實現單點登錄 代碼…

微服務Eureka組件的介紹、安裝、使用

微服務 Eureka 組件的介紹、安裝與使用詳解 在微服務架構中&#xff0c;服務注冊與發現是至關重要的一環&#xff0c;而 Eureka 作為 Netflix 開源的服務注冊中心&#xff0c;廣泛應用于 Spring Cloud 微服務體系中。本文將帶你全面了解 Eureka 的概念、安裝及在 Spring Boot …

【PostgreSQL內核學習:通過 ExprState 提升哈希聚合與子計劃執行效率(一)】

PostgreSQL內核學習&#xff1a;通過 ExprState 提升哈希聚合與子計劃執行效率&#xff08;一&#xff09;引言背景補丁的意義補丁概述JIT & LLVM實際例子&#xff08;以 PostgreSQL 為例&#xff09;提交信息提交描述引入 ExprState 進行哈希計算&#xff1a;支持 JIT 編譯…

web端播放flv視頻流demo(flv.js的使用)

需求&#xff1a;原本是需要前端播放RTMP視頻流的&#xff0c;但是現在的瀏覽器都不支持flash插件了&#xff0c;讓用戶安裝flash插件也不現實&#xff0c;所以直接讓后端將RTMP視頻流轉換成flv視頻流給到前端進行播放。 直接上demo&#xff0c;直接就能播放&#xff0c;如果遇…

【拍攝學習記錄】04-拍攝模式/曝光組合

曝光組合全自動半自動光圈優先手動擋【固定物體長時間不變時候、閃光燈時候、】手機上的光學變焦與數碼變焦是不同的&#xff0c;使用檔位推薦可以提升畫質。手機夜景模式長曝光【車流軌跡、星軌】HDR 大光比【日落時候使用】專業模式&#xff0c;【感光度iso、快門可以調節】…

新liunx部署mysql過程問題

首先看下是什么發行版 cat /etc/os-release CentOS Linux 7 ################################## 使用 yum下載包 發現不行 源不行 那就換成阿里的 # 進入 yum 源配置目錄 cd /etc/yum.repos.d/ # 備份所有默認 repo 文件&#xff08;以 CentOS 為例&#xff0c;其他系統…

Python 第三方庫:Beautiful Soup(HTML/XML 解釋提取)

Beautiful Soup 是一個 用于從 HTML 和 XML 文件中提取數據的 Python 第三方庫。它為復雜的網頁結構提供了簡單易用的解析接口&#xff0c;尤其適合網頁爬蟲和數據提取任務。Beautiful Soup 提供樹型結構訪問、標簽搜索、屬性提取等功能&#xff0c;并支持多種解析器&#xff0…

使用STM32CubeMX使用CAN驅動無刷電機DJI3508

簡介 文章為筆記性質 硬件包括 大疆C板 電機調速器C620 DJI3508電機 CAN知識介紹 CAN的概念 CAN是控制器區域網絡&#xff08;Controller Area Network&#xff09;的縮寫。CAN總線是一種適用于工業設備的高性能總線網絡。說白了就是也就是一種通訊方式而已。 把多個設…

Wi-Fi 802.11s自組網/EasyMesh自組網/802.11ah物聯網

一、前期調研結論 前面詳細探討了自組網和5G無線通信網絡、WiFi無線通信網絡的差異&#xff1a; 自組網 v.s 5G v.s WiFi-CSDN博客 從“分級道路”角度理解無線通信網絡拓撲包括從當前工業應用場景具體案例了解終端無線通信網絡&#xff1a; 5G無線通信網絡場景&#xff08;…

【基于hyperledger fabric的教育證書管理系統】

教育證書管理系統 系統概述 項目背景 隨著數字化轉型的深入推進&#xff0c;教育證書作為個人學術成就和專業資質的重要憑證&#xff0c;在就業市場、高等教育和職業發展中扮演著關鍵角色。然而&#xff0c;傳統教育證書管理體系面臨著數據孤島、證書偽造、驗證流程繁瑣以及跨機…