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;传统教育证书管理体系面临着数据孤岛、证书伪造、验证流程繁琐以及跨机…