先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
正文
结构化数据计算的返回值的结构随计算过程而变,大量的中间结果同样是动态结构,这些都难以事先定义,而Java是强类型语言,又必须事先定义数据对象的结构(否则只能用map这类操作繁琐的数据对象),这就使Java的结构化计算僵化死板,lambda语法的能力严重受限。解释性语言可以简化参数的定义,函数本身就可指定参数表达式应解释成值参数还是函数参数,而Java是编译型语言,难以区分不同类型的参数,必须设计复杂的接口才能实现匿名函数(主要指lambda语法),这连SQL程序员都不易掌握。省略数据对象而直接引用字段(比如写成"单价*数量"),可显著简化结构化数据计算,但Java缺乏专业的结构化数据对象,目前还无法支持此类表面简单实则巧妙的语法,这就使Java代码冗长且不直观(只能写成"x.单价*x.数量")。
缺少结构化数据计算类库还会导致代码过长,同样的一个分组汇总用SQL一句就能写出来改成Java就要写几十行,这显然也对简化复杂SQL无益。这个问题即使在Java8增加了Stream后也没有明显改善,为了简化运算用Java取代SQL基本不可能(有些应用用Java做数据处理往往是由于架构上的要求,就其简便性上还远不及SQL)。
另外,Java作为编译型语言很难热部署,也就难以及时应对多变的数据计算场景。
Python
直接的Java不行,那大热的Python怎么样呢?Python+SQL可比Java+SQL容易得多了吧。
的确,Python(主要是Pandas)提供了丰富结构化计算类库,计算实现要比 Java 简单很多。不过,实际使用Pandas处理数据尤其是复杂运算时也会碰到代码很难写的情况。其实,Pandas 本来就不是为结构化数据设计的,它并不是我们熟悉的数据表(一行行数据记录的集合),而是个矩阵。用来处理结构化数据时,做些过滤合并这些简单运算还好点,碰到分组有序等复杂一些运算,就会比较麻烦了,思路上也经常要绕一下。
这还不是Python的主要问题,Python与应用结合的难点在于其集成性上。
Python很难与Java应用集成!
Python和Java集成主要有两种方式。一种是服务式调用,既然Python和Java是两套体系,那就单独部署通过服务(网络通信)的方式交互,这种方式要维护两套应用比较麻烦,还会存在一些安全认证系统权限等管理问题,而且数据交换的性能也很差,不到万不得已不会采用这种方式。另一种是使用Jython这种解释器(JVM上的Python),由于采用Java开发可以很方便与应用集成,但Jython又缺乏足够的计算库(如Pandas)很难应付那些复杂计算。无论采用何种方式,都会在应用方面产生巨大限制,导致在Java应用中用Python来实现复杂计算的可行性不高。
除非你把整个应用都用Python写,但是Java的各种企业级能力又用不上了,做做小应用还行吧。
Scala
Scala的特性与Python类似,都提供了DataFrame对象,实现简单的结构化数据计算也比较简单,作为高级语言有序、对象属性化等特性支持良好,相对Java在集合运算上也更简单。Scala运行于JVM之上,天生就容易被JAVA集成,这些都是Scala的优点。
Scala的缺点在于使用难度较大,难学更难精,用于复杂数据处理与SQL相比尤有劣势,也就不用想通过Scala简化复杂SQL了。这大概也是为什么Spark要回归SQL的原因了吧。而且,Scala作为编译型语言同样不支持热部署。
SPL
这些高级语言都存在这样那样的缺点,从简化复杂SQL的角度来看无一能胜任。那还有什么办法呢?
其实,从前面的分析中我们明显能够感受到,面向结构化数据计算尤其是复杂计算,现有技术(开发语言)都各有优缺点,SQL擅长复杂计算但对有序、过程支持不好,Java恰好反过来支持有序和过程但集合计算能力很弱。如果能综合这些技术的优点,那简化复杂SQL的目标也就达成了。
开源SPL恰好是这样一个产品。
SPL全称Structured Process Language,是一个专门用于结构化数据计算的程序语言。
常规计算能力
一致的数据类型
SPL相对Java提供了更专业的结构化数据类型,即序表。和SQL的数据表一样,序表是批量记录组成的集合,具有结构化数据类型的一般功能,可以与SQL无缝交互承接SQL的返回值。
序表支持所有的结构化计算函数,计算结果也同样是序表,而不是Map之类的数据类型。比如对分组汇总的结果,继续进行结构化数据处理。
Orders.groups(year(OrderDate):y; sum(Amount):m).new(y:OrderYear, m*0.2:discount)
丰富的计算类库
在序表的基础上,SPL提供了丰富的结构化数据计算函数,比如过滤、排序、分组、去重、改名、计算列、关联、子查询、集合计算、有序计算等。这些函数具有强大的计算能力,无须硬编码辅助,就能独立完成计算。
如组合查询:
Orders.select(Amount>1000 && Amount<=3000 && like(Client,"\*bro\*"))
内关联:
join(Orders:o,SellerId ; Employees:e,EId).groups(e.Dept; sum(o.Amount))
SPL支持简单形式的Lambda语法,无须定义函数名和函数体,可以直接用表达式当作函数的参数。修改业务逻辑时,也不用重构函数,只须简单修改表达式。SPL是解释型语言,使用参数表达式时不必明确定义参数类型,使Lambda接口更简单。比如计算平方和,想在sum的过程中算平方,可以直观写作:Orders.sum(Amount*Amount)。
同时作为解释执行语言的SPL还天然支持动态数据结构,可以根据计算结果结构动态生成新序表,特别适合计算列、分组汇总、关联这类计算。较复杂的计算通常都要拆成多个步骤,每个中间结果的数据结构几乎都不同。SPL支持动态数据结构,不必先定义这些中间结果的结构。比如,根据某年的客户回款记录表,计算每个月的回款额都在前10名的客户。
Sales2021.group(month(sellDate)).(~.groups(Client;sum(Amount):sumValue)).(~.sort(-sumValue)).(~.select(#<=10)).(~.(Client)).isect()
过程控制与SQL协同
除了提供与SQL相当的集合运算能力,SPL还对过程控制和分步计算提供了良好支持,灵活的分支判断语句、循环语句,配合专业的结构化数据对象,可以方便地实现各类业务逻辑。比如找出销售额累计占到一半的前n个大客户,可以这样分步实现:
A | |
1 | =db.query(“select client,sum(amount) amount from sales group by client order by amount desc”) |
2 | =A1. sum(amount)/2 |
3 | =0 |
4 | =A1.pselect((A3=A3+amount,A3>=A2)) |
5 | =A1(to(A4)) |
通过SQL先完成分组汇总并按汇总值降序排序,然后SPL承接SQL的计算结果再通过分步方式完成后续计算,SPL与SQL有效结合,这样就很大程度达到了简化复杂计算的目标。
在应用中,SPL很多时候都要与SQL交互协同,充分发挥二者的优势,包括数据库读写、事务处理、流程处理、存储过程调用等。
数据库写入(更新/插入):
db.update@u(A7,sales;ORDERID)
执行DML语句:
db.execute("insert into DEPARTMENT(DEPT, MANAGER) values(?,?)","TecSupport",9)
调用存储过程:
db.proc({db_proc(?,?),,:101:"o":table1,1:0:"i": })
丰富的集合运算能力加上过程计算与流程控制(包括指挥SQL),这样就获得了SQL和Java相当的能力,而实现上要比Java更简单。
超越SQL的能力
SPL不仅覆盖了SQL的所有计算能力,还提供了更强大语言功能。基于这些特性可以很方便原来在SQL中不易完成的运算,简化复杂计算可不是开玩笑的。
离散性及其支持下的更彻底的集合化
集合化是SQL的基本特性,即支持数据以集合的形式参与运算。但SQL的离散性很不好,所有集合成员必须作为一个整体参于运算,不能游离在集合之外。而Java等高级语言则支持很好的离散性,数组成员可以单独运算。但是,更彻底的集合化需要离散性来支持,集合成员可以游离在集合之外,并与其它数据随意构成新的集合参与运算 。
SPL兼具了SQL的集合化和Java的离散性,从而可以实现更彻底的集合化。
SPL很容易表达“集合的集合”,适合分组后计算。比如,找到各科成绩均在前10名的学生:
A | |
1 | =db.query(“select * from score”) .group(subject) |
2 | =A2.(.rank(score).pselect@a(<=10)) |
3 | =A1.(~(A3(#)).(name)).isect() |
有序支持
有序计算是离散性和集合化的典型结合产物,成员的次序在集合中才有意义,这要求集合化,有序计算时又要将每个成员与相邻成员区分开,会强调离散性。SPL兼具集合化和离散性,天然支持有序计算。
具体来说,SPL可以按绝对位置引用成员,比如,取第3条订单可以写成Orders(3),取第1、3、5条记录可以写成Orders([1,3,5])。
SPL也可以按相对位置引用成员,比如,计算每条记录相对于上一条记录的金额增长率:
Orders.derive(amount/amount[-1]-1)
SPL还可以用#代表当前记录的序号,比如把员工按序号分成两组,奇数序号一组,偶数序号一组:
Employees.group(#%2==1)
在有序计算的支持下,再处理结构化数据计算中关于次序的运算(诸如比上月、比去年同期、前 20%、排名等)就很方便了。
对象引用
SPL序表的字段可以存储记录或记录集合,这样可以用对象引用的方式,直观地表达关联关系,即使关系再多,也能直观地表达。比如,根据员工表找到女经理下属的男员工:
Employees.select(gender:"male",department.manager.gender:"female")
更方便的函数语法
提供大量功能强大的结构化数据计算函数本来是一件好事,但这会让相似功能的函数不容易区分,无形中提高了学习难度。
SPL提供了特有的函数选项语法,功能相似的函数可以共用一个函数名,只用函数选项区分差别。比如select函数的基本功能是过滤,如果只过滤出符合条件的第1条记录,可以使用选项@1:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
项@1:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-3T9mhYDe-1713326876492)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!