spark算子操作
创建RDD的本地文件
转换操作
map map操作是对RDD中的每个元素都执行一个指定的函数来产生一个新RDD,任何原RDD中的元素在新RDD
中的元素在新RDD中都有且只有一个元素与之对应
flatMap操作与map操作类似,区别是原RDD中的每个元素经过map处理后只能生成一个元素,而在flatMap操作中原RDD中的
每个元素可生成一个或多个元素来构建新RDD。
distinct distinct操作是去除RDD重复的元素,返回所有元素不重复的RDD。
coalesce和repartition都是对RDD进行重新分区。coalesce操作使用HashPartition进行重新分区。
coalesce第一个参数为充分区的数目,第二个为是否进行shuffle,默认情况为false。repartition操作是coalesce函数第二个参数为
true的实现。(注意:coalesce重新分区的数目小于原分区的数目,可以正常进行。如果重新分区的数目大于原来的分区数,那么必须指定shuffle参数为true,否则分区数不变)
randomSplit randomSplit操作是根据weights权重将一个RDD分隔为多个RDD,而glom操作则是RDD中每一个分区所有类型
为T的数据转变成元素类型为T的数组【Array[T]】
union union操作是将两个RDD合并,返回两个RDD的并集,返回元素不去重。
intersection intersection操作类似SQL中的inner join操作,返回两个RDD的交集,交集结果去重。
subtract返回在RDD中出现,且不在otherRDD出现的元素,返回元素不去重。在intersection和subtract操作中参数numPartitons
指定返回RDD的分区数,参数用于指定partitioner用于指定分区函数。
mapPartitions操作类似,只不过映射的参数由RDD中的每个元素变成了RDD中每个分区的迭代器,其中preservesPartitions表示是否保留父RDD的partitioner分区信息。如果在映射的过程中需要频繁创建额外的对象,使用mapPartition操作要比map操作高效的多。比如,将RDD中的所有数据通过JDBC连接写入到数据库,如果使用map函数,可能要为每一个元素都创建一个connection,这样开销很大。如果使用mapPartitions,那么只需要针对每个分区建立一个connection。mapPartitionsWithIndex操作类似于mapPartitions,只是输入参数多了一个分区索引
zip zip操作用于将两个RDD组合成Key/value形式的RDD,这里默认两个RDD的partition数量以及元素数量都相同,否则会抛出异常。zipPartitions操作将多个RDD按照partition组合成为新的RDD,该操作需要组合的RDD具有相同的分区数,但对于每个分区内的元素数量没有要求。
举例:使用mapPartitionWithIndex操作,按照partition组合成为新的RDD
键值转换操作
partitionBy操作根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区。
mapValues mapValues类似于map,只不过mapValues是针对[K,V]中的V值进行map操作,同理,flatMapValues相对
flatMap,flatMapValues是针对[K,V]中的V值进行flatMap操作
combineByKey操作用于将RDD[K,V]转换成RDD[K,C],这里的V类型和C类型可以相同也可以不同。flodByKey操作用于RDD[K,V]根据K将V做折叠、合并处理,其中的参数zeroValue表示先根据映射函数将zeroValue应用于V,进行初始化V,再将映射函数应用于初始化的V。其中combineByKey中的参数含义如下。
combineByKey操作用于将RDD[K,V]转换成RDD[K,C]
groupByKey操作用于将RDD[K,V]中每个K对应的V值合并到一个集合Iterable[V]中,reduceByKey操作用于将RDD[K,V]中每个K对应的V值根据映射函数来运算,其中参数numPartitions用于指定分区数,参数partitioner用于指定分区函数。reduceByKeyLocally和reduceByKey功能类似,不同的是,reduceByKeyLocally运算结果映射到一个Map[K,V]中,而不是RDD[K,V]
cogroup相当于sql中的全外关联,返回左右RDD中的记录,关联不上的为空,可传入的参数有1~3个RDD,参数numPartitions用于指定分区数,参数partitioner用于指定分区函数。
join、fullOuterJoin、leftOuterJoin、rightOuterJoin都是针对RDD[K,V]中K值相等的连接操作,分别对应内连接,全连接,左连接和右连接,这些操作都调用cogroup进行实现,subtractBuyKey和基本操作subtract,只是subtractByKey和基本操作subtract,只是subtractByKey针对的是键值操作。其中参数numPartitions用于指定分区数,参数partitioner用于指定分区函数。
控制操作
Spark可以将RDD持久化到内存或磁盘文件系统中,把RDD持久化到内存中可以极大地提高迭代计算以及各计算机之间的数据共享,一般情况下执行节点60%内存用于缓存数据,剩下的40%用于运行任务,具体内存管理可以参见RDD的内存管理章节。spark中使用persist和cache操作进行持久化,其中cache是persist()的特例,操作详细信息如下:
在spark中可以使用checkpoint操作设置检查点,相对持久化操作persist()操作,checkpoint将切断与该RDD之前的依赖关系("血统")。设置节点对包含宽依赖的长血统的RDD是非常有用的,可以避免占用过多的系统资源和节点失败情况下重新计算成本过高的问题。
检查目录
行动操作
count():表示返回RDD中的元素个数
reduce(f:(T,T) => T):T根据映射函数f,对RDD中的元素进行二元计算
collect():Array[T]表示将RDD转换成数组
take(num:Int):Array[T]表示获取RDD中从0到num-1下标的元素,不排序。
top(num:Int):Array[T]表示从RDD中,按照默认(降序)或者指定的排序规则,返回前num个元素
takeOrdered(num:Int):Array[T]和top类似,只不过以和top相反的顺序返回元素。
aggregate[U](zeroValue:U)(seqOp:(U,T) =>U,combOp:(U,U) => U)(impliicit arg():ClassTag[T]:)U
aggregate用户聚合RDD中的元素,先使用seqOp将RDD中每个分区中的T类型元素聚合成U类型,再使用
combOp将之前每个分区聚合后的U类型聚合成U类型,特别注意seqOp和comOp都会使用zeroValue的值,
zeroValue的类型为U。
fold是aggregate的简化,将aggregate中的seqOp和combOp使用相同的op
lookup用于(K,V)类型的RDD,指定K值,返回RDD中该K对应的所有V值。
countByKey统计RDD[K,V]中的每个K的数量
foreach遍历RDD,将函数f应用于每一个元素。要注意如果对RDD执行foreach,只会在Executor端有效,而并不是Driver端,比如:rdd.foreach(println),只会在Executor的stdout中打印出来,Driver端是看不到的。
foreachPartition和foreach类似,只不过是对每一个分区使用f
sortBy根据给定的排序k函数将RDD中的元素进行排序
saveAsTextFile(path:String):Unit
saveAsTextFile用于将RDD以文本文件的格式存储到文件系统中,codec参数可以指定压缩的类名
saveAsSequenceFile用于将RDD以SequenceFile的文件格式保存到HDFS上。用法同saveTextFile
saveAsObjectFile用于将RDD中的元素序列化成对象,存储到文件中,对于HDFS,默认采用SequenceFile保存
saveAsHadoopFile是将RDD存储在HDFS上的文件中,支持老版本的Hadoop API,可以指定outputKeyClass、outputValueClass以及压缩格式。