。
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再笛卡尔积
关键字的简短总结:
参考文章:
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
机制避免缓存丢失(内存不足)要重新计算带来的性能开销,会导致另外一个作业,比缓存更可靠