抽样转换和行动源码剖析






f函数的输入输出都是每个分区集合的迭代器迭代器

def mapPartitions =比;Iterator[U], preservesPartitioning: Boolean=false)(implicit arg0: ClassTag[U]): RDD[U]
该函数和map函数类似,只不过映射函数的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器。如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions要比map高效的过。
比如,将RDD中的所有数据通过JDBC连接写入数据库,如果使用map函数,可能要为每一个元素都创建一个connection,这样开销很大,如果使用mapPartitions,那么只需要针对每一个分区建立一个connection。
参数preservesPartitioning表示是否保留父RDD的partitioner分区信息。
参考文章:



union(other: RDD[T])操作不去重,去重需要distinct()


subtract取两个RDD中非公共的元素

sample返回RDD,takeSample直接返回数组(数组里面的元素为RDD中元素,类似于collect)


keyvalue之类的操作都在中

mapValues只对value进行运算


groupBy相同key的元素的value组成集合





源码分析:





所以优先使用reduceByKey,参考文章:




本质是先coGroup再笛卡尔积







RDD Transformation和Action源码剖析 关键字的简短总结:





参考文章:



cache persist也是lazy级别的


Action本质sc.runJob

foreach

collect()相当于toArray返回一个数组

collectAsMap()对keyvalue类型的RDD操作返回一个HashMap,key重复后面的元素会覆盖前面的元素reduce

源码解析:先调用collect()再放到HashMap[K, V]中









相当于reduceByKey+collectAsMap()

该函数将RDD[K,V]中每个K对应的V值根据映射函数来运算,运算结果映射到一个Map[K,V]中,而不是RDD[K,V]。

参考文章:



也是针对keyvalue返回指定key对应的value形成的seq







前两个元素作用的结果与第三元素作用依次类推


文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File)。目前,也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案,他们的基本思路就是将小文件进行合并成一个大文件,同时对这些小文件的位置信息构建索引。不过,这类解决方案还涉及到Hadoop的另一种文件格式——文件。SequenceFile文件并不保证其存储的key-value数据是按照key的某个顺序存储的,同时不支持append操作。

参考文章:




->TextOutputFormat  (key为null,value为元素toString)

(二进制)->saveAsSequenceFile->SequenceFileOutputFormat(key为null,value为BytesWritable)


cache\persist   


机制避免缓存丢失(内存不足)要重新计算带来的性能开销,会导致另外一个作业,比缓存更可靠

抽样转换和行动源码剖析