Scala中的一些概念是Spark中有相似的地方,在这里总结以下,以作为进一步的巩固
Scala的函数式编程
1.基本概念
匿名函数
闭包 (函数和上下文-函数和运行时的数据)
函数科里化-柯里化 Curry --只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数
带有多参数的函数转化为一系列函数,每个函数都只有一个参数
偏函数
递归- 尾递归
函数式编程中的
数据结构
数据结构中的常见操作:
通用的操作:
各自特有的操作:
flatter map == flatMap
折叠:scan scanLeft scanRight-将中间结果放到新的集合,并将中间结果传递给一下函数调用
输入参数: 初始值和运算函数
返回值:中间结果新的集合
规约: reduce
聚合: sum 实际上调用的是 foldLeft
span 遇到不符合就停止
partition 对所有元素进行断言判断
分组:按照条件将元素分组-根据提供的函数生成分组关键字
2.通用操作归类
01.映射与遍历 map flatMap foreach Iterator flatten filter filterNot filterKeys mapValue
02.混洗 shuffle<隐式操作-对用户透明>
03.规约与聚合 fold reduce aggregate max min
04.分区和分组 partition groupBy grouped
05.数据变换 zip unzip zipWithIndex concat toArray toList collect range
06.逻辑判断 empty isEmpty contains containsSlice
07.查看 head tail last init take drop slice size count find apply
indexOf lastIndexOf indexWhere lastIndexWhere indexOfSlice lastIndexOfSlice
startsWith endsWith
08.其他重要 drop dropWhile take takeWhile
排序: sorted sortWith sortBy
去重: distinct
集合操作: diff union intersect
insert append
add remove clear
put remove clear update keys keySet values
trim
pop push update clear top
get getOrElse
09.其他不常见: 转置 transpose 反转 reverse 转换 transform
mkString addString stringPrefix copyToArray clone
填充 fill 滑动 sliding
Spark 的一些内容
基于RDD的操作
RDD的类型-- RDD pairRDD
函数作用以及返回值类型
01. foreach 、map、flatMap
foreach 对集合中每个元素进行操作 没有返回值
map 对集合中每个元素进行操作
flatMap 返回的迭代器的所有内容构成新的RDD
是一个序列化的数据而不是单个数据项-- a Seq
区别
map:对集合中每个元素进行操作。
flatMap:对集合中每个元素进行操作然后再扁平化。
02. fold 以及 reduce 和 aggragate
fold 将中间结果传递给下一次函数调用,返回最后一次函数计算的结果-返回结果是一个单值,其类型与初始值相同
共同点:返回的数据类型
不同点:fold需要提供初始值 fold foldLeft foldRight
reduce函数和fold 函数输入和输出数据类型 必须一致
aggragate 并不要求返回结果的类型是集合元素类型的父类
aggregate先对每个分区的元素做聚集,然后对所有分区的结果做聚集
Aggregate
eg:
t.reduce(_ +_)
t.fold(0)( _ +_)
aggregate(0)(_+_, (_,_)=>0) seqop在遍历分区的时候更新结果, combop -分区汇总--并行有分区的情况下
aggregate(0)(_+_, _+_)
03.groupByKey 和reduceByKey
groupByKey():--作用以及返回值类型 --对具有相同键的值进行分组
groupByKey也是对每个key进行操作,但只生成一个sequence
[K, Iterable[V]]
reduceByKey() ---------------------------- 合并具有相同键的值
规约,对具有键相同的值合并起来--返回 各键以及 对应键规约出来的结果值 组成的新的RDD
对大数据进行复杂计算时,reduceByKey优于groupByKey
AggregateByKey 根据Key的值来聚合--aggregateByKey调用的就是combineByKey方法
combineByKey
groupByKey()是对RDD中的所有数据做shuffle,根据不同的Key映射到不同的partition中再进行aggregate
aggregateByKey()是先对每个partition中的数据根据不同的Key进行aggregate,然后将结果进行shuffle,完成各个partition之间的aggregate
grouped 将对象分成固定大小组,且最后一组之前的组的大小必须相同,最后一组必须小于
grouped 是根据元素数量分组
groupBy 是根据计算的键值进行分组
.reduceByKey(_+_, reduceNum)
04.分区执行mapPartitions foreachPartition
Spark提供基于分区的map和foreach
mapPartitions foreachPartition
从算子的类型:
foreachPartition应该属于action运算操作,而 mapPartitions 是在Transformation中
返回值上:mapPartitions 返回值类型迭代器: Iterator[U] 该元素的迭代器
应用场景上:
mapPartitions可以获取返回值,继续在返回RDD上做其他的操作
foreachPartition因为没有返回值并且是action操作,所以使用它一般都是在程序末尾比如说要落地数据到存储系统中如mysql,es,或者hbase中,
02.并行度
001.对于已知的RDD进行重分区
002.数据混洗操作中,使用参数的方式为混洗后的RDD指定并行度
05.重分区:repartition 和 coalesce
repartition() 把RDD随机打乱并分成设定的分区数目
coalesce():减少分区--没有打乱
对RDD的分区进行重新划分,repartition内部调用了coalesce,参数shuffle为true
扩大分区
减少分区
coalesce算子,可以手动减少DataFrame的partition数量,并且不用触发shuffle,
这也是coalesce跟repartition的区别
repartition一定会触发shuffle
06.广播变量和累加器
SparkContext 通过broadcast( ) 方法传递即将被广播的变量-返回Broadcast[T]
从Driver 到任务,单向传播,没有办法更新
通过accumulator( )方法创建一个累加器变量
07.leftOuterJoin连接操作
2.数据结构
RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集
RDD PairRDDFunctions
三者都有partition的概念,
三者都有惰性机制,在进行创建、转换,
如map方法时,不会立即执行,只有在遇到Action如foreach时,三者才会开始遍历运算
对DataFrame和Dataset进行操作许多操作都需要这个包进行支持- import spark.implicits._
DataFrame也可以叫Dataset[Row],
每一行的类型是Row,不解析,每一行究竟有哪些字段,各个字段又是什么类型都无从得知
Dataset中每一行是什么类型是不一定的
基于DataSet的操作
DataSet数据类型的转化
df.printSchema()
foreach foreachPartition filter flatMap mapPartitions transform
reduce
head() take() count() isEmpty where(
collect() collectAsList()
persist() storageLevel
checkpoint() coalesce repartition repartitionByRange(
columns
orderBy sortWithinPartitions sort
groupByKey
intersect union
agg groupBy
join
explain()
provide common aggregations such as count(), countDistinct(), avg(), max(), min()
UserDefinedAggregateFunction extends Serializable