既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
A | |
1 | =connect(“mysql”) |
2 | =A1.query@x(“SELECT SID,ATTDATE,DURATION,null AS W FROM STUTEST WHERE DURATION>=7 ORDER BY SID,ATTDATE”).run(W=pdate@w(ATTDATE)) |
3 | =A2.group@o(SID;.groups@o(W;count():CNT).select(CNT==7).group@i(W-W[-1]!=7).max(~.len()):weeks) |
4 | =A3.select(weeks>=4).(SID) |
简化复杂的集合运算,SPL序表的集合化更加彻底,配合灵活的语法和强大的集合函数,可大幅简化复杂的集合计算。比如,在各部门找出比本部门平均年龄小的员工:
A | |
1 | …//省略序表Employees的生成过程 |
2 | =Employees.group(DEPT; (a=.avg(age(BIRTHDAY)),.select(age(BIRTHDAY)<a)):YOUNG) |
3 | =A2.conj(YOUNG) |
计算某支股票最长的连续上涨天数:
A | |
1 | …//省略序表AAPL的生成过程 |
2 | =a=0,AAPL.max(a=if(price>price[-1],a+1,0)) |
SPL可以方便地实现分步计算,序表的集合化更加彻底,可以用变量方便地表达集合,适合多步骤计算,很多SQL难以表达的集合运算,用SPL都可以轻松实现。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:
A | B | |
1 | //省略取数据的过程 | |
2 | =A1.sort(amount:-1) | /销售额逆序排序,可在SQL中完成 |
3 | =A2.cumulate(amount) | /计算累计序列 |
4 | =A3.m(-1)/2 | /最后的累计即总额 |
5 | =A3.pselect(~>=A4) | /超过一半的位置 |
6 | =A2(to(A5)) | /按位置取值 |
简化复杂的关联计算。
序表的专业性体现在多方面,其中之一是支持对象引用的形式表达关联,开发者可以通过点号直观地访问关联表,从而提高开发效率。很多SQL难以表达的关联计算,用SPL都可以轻松实现。比如,根据员工表计算女经理的男员工:
=employees.select(gender:“male”,dept.manager.gender:“female”)
专业的结构化数据对象
SPL是JVM下的开源结构化数据计算引擎,内置专业的结构化数据对象序表,可以和数据库表/记录方便地互转,支持动态数据结构,提供了灵活易用的访问方法、维护方法、计算函数。序表专业性强,为数据计算和流程控制提供了有力的底层支撑,可以方便地实现SQL后计算中的各类业务逻辑。
直接的数据库交换方法,可以在数据库表(SQL结果集)和SPL序表之间进行互转。
比如,使用query函数执行SQL,生成单条记录序表:
A | B | |
1 | =connect(“orcl”) | //连接数据库 |
2 | .query(“select * from sales where orderid=?”,201)=r=A1 | //查询单条记录 |
3 | =db.close() | //关闭数据库连接 |
如果SQL返回多条记录,则自动生成多条记录序表:
=T=A1.query(“select * from salesR where SellerID=?”,10)
反过来也简单,用update函数就可以将序表记录批量地持久化到数据库。比如,原序表为T,经过多条件记录的增删改之后的序表为NT,将两者的变更结果统一写入数据库:
=A1.update(NT:T,sales;ORDERID)
灵活的序表访问方法,可以按字段名或记录号自由地访问序表。
取序表的第3条记录:T(3)
取后3条记录:T.m([-1,-2,-3])
取记录的字段值:T(3).Amount*0.05
取一列,返回集合:T.(Amount)
取几列,返回集合的集合:T.([CLIENT,AMOUNT])
先按字段名取再按记录序号取:T.(AMOUNT)(3)
先按记录序号取再按字段名取:T(3).AMOUNT
易用的序表维护方法,可以对单条或多条记录记录进行统一的增删改操作。
追加记录:T.insert(200,“APPL”,10,2400.4,date(“2010-10-10”))
修改记录:T(3).Amount = T(3). Amount*1.05
删除记录:T.delete(T.select(ORDERID209 || ORDERID208))
丰富的序表计算函数,可进行完整的SQL式计算。
过滤:T.select(Amount>1000 && Amount<=3000 && like(Client,“bro”))
排序:T.sort(-Client,Amount)
去重:T.id(Client)
汇总:T.max(Amount)
分组汇总后过滤: T.groups(year(OrderDate),Client; avg(Amount):amt).select(amt>2000)
关联:join(Orders:o,SellerId ; Employees:e,EId).groups(e.Dept; sum(o.Amount))
交集:T1.id(Client) ^ T2.id(Client)
TopN:T.top(-3;Amount)
分组topN:T.groups(Client;top(3,Amount))
支持动态数据结构,可根据上一步的计算结果推断出新数据结构,并自动生成新序表,新序表可直接进行计算。比如先分组汇总,再过滤,最后排序:
T.groups(SellerId, Client; sum(Amount):amt, count(1):cnt).select(amt>10000 && amt<=30000 && like(Client,“*bro*”)).sort(amt)
这样,就要在应用程序中实现SQL后计算任务。
Java是重要的开发语言,但JDK提供的方法过于基础,虽然能实现SQL后计算,但开发效率很低。
ORM是Java中用来实现SQL后计算的常见方案。但几种较流行的ORM都缺乏专业的结构化数据对象,不支持动态数据结构。虽然可以利用Java实现流程控制,但难以进行灵活的计算。这些ORM技术的计算能力还远不如SQL,提供的计算函数非常有限,用Java硬写的现象仍然非常普遍。
Stream的链式编程比ORM的HQL更加面向对象,且有Lambda语法的加成,也常被用于SQL后计算,有些ORM还能直接生成Stream对象。但Stream同样没有专业的结构化数据对象,不支持动态数据结构。此外,Stream的计算能力也较差,甚至不如ORM,即使排序、分组汇总、关联这样的基础计算,也要辅以大量编码。
Kotlin基于JVM,且在链式编程和Lambda语法上对Stream进行了一系列改进,也可以用于SQL后计算。但因为编译型语言的底层,Kotlin只能对Stream小幅微调,重大缺点一个没少。
Python Pandas有较强大的结构化数据处1理能力,有时也可以用于SQL后计算,但因为缺乏易用的接口,很难被Java集成,很少出现在正式项目中。
esProc SPL是更好的SQL后计算技术。
灵活的流程控制能力
SPL提供了灵活易用的分支判断语句、循环语句,配合专业的结构化数据对象,可以方便地实现各类业务逻辑。
分支判断语句:
A | B | |
2 | … | |
3 | if T.AMOUNT>10000 | =T.BONUS=T.AMOUNT*0.05 |
4 | else if T.AMOUNT>=5000 && T.AMOUNT<10000 | =T.BONUS=T.AMOUNT*0.03 |
5 | else if T.AMOUNT>=2000 && T.AMOUNT<5000 | =T.BONUS=T.AMOUNT*0.02 |
循环语句:
A | B | |
1 | =db=connect(“db”) | |
2 | =T=db.query@x(“select * from sales where SellerID=? order by OrderDate”,9) | |
3 | for T | =A3.BONUS=A3.BONUS+A3.AMOUNT*0.01 |
4 | =A3.CLIENT=CONCAT(LEFT(A3.CLIENT,4), " co.,ltd.") | |
5 | … |
与Java的循环类似,SPL还可用break关键字跳出(中断)当前循环体,或用next关键字跳过(忽略)本轮循环,不展开说了。
流程控制语句配合序表,可以用统一的语法风格实现业务逻辑,包括数据库读写、事务处理、流程处理、数据计算。比如,根据一定的规则计算奖金:
A | B | C | |
1 | =db=connect@e(“dbName”) | /连接数据库,开启事务 | |
2 | =db.query@1(“select sum(Amount) from sales where sellerID=? and year(OrderDate)=? and month(OrderDate)=?”, p_SellerID,year(now()),month(now())) | /查询当月销售额 | |
3 | =if(A2>=10000 :200, A2<10000 && A2>=2000 :100, 0) | /本月累计奖金 | |
4 | =p_Amount*0.05 | /本单固定奖金 | |
5 | =BONUS=A3+A4 | /总奖金 |
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!