Spark RDD 两大操作
Resilient Distributed Dataset - 弹性分布式数据集,是一个容错的,并行的数据结构,可以让用户显式的将数据存储到磁盘和内存中,并能控制数据的分区。
Transformation 转换
一个RDD经过计算后生成新的RDD
- map
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD;RDD之间的元素是一对一关系
val rdd1 = sc.parallelize(1 to 9, 3).map(x => x*2)
- filter
filter是对RDD元素进行过滤;返回一个新的数据集,由经过func函数后返回值为true的原元素组成
val rdd2 = rdd1.filter(x => x > 10)
- flatMap
flatMap类似于map,但是每一个输入元素,会被映射为0或多个输出元素(因此,func函数的返回值是一个seq,而不是单一元素),RDD之间的元素是一对多关系
val rdd3 = rdd2.flatMap( x => x to 39)
- mapPartitions
mapPartitions是map的一个变种。map的输入函数是应用于RDD中的每个元素;而mapPartitions的输入函数是每个分区的数据,也就是把每个分区中的内容作为整体来处理的
def myfunc[T](iter: Iterator[T]): Iterator[(T, T)] = {...}
val rdd4 = rdd3.mapPartitions(myfunc)
当map里面有比较耗时的初始化操作时,比如链接和断开数据库,可以采用mapPartitions,它只需对每一个partition操作一次即可,函数的输入/输出都是iterator类型
mapPartitionsWithIndex
mapPartitionsWithIndex与mapPartitions的功能类似,只是多传入split.index而已,所有func函数必须是(Int, Iterator<T>) => Iterator<U>类型sample
sample根据给定的随机种子seed,随机抽样出数量为frac的数据。
sample(withReplacement, fraction, seed)
// withReplacement: 是否放回抽样
// fraction: 比例,0.1表示10%
//seed: 随机种子,相同seed得到的随机序列是一样的,所以如果不设seed,同一段代码执行两遍得到的随机序列是一样的
union
union是数据合并,返回一个新的数据集intersection
intersection是数据交集,返回一个新的数据集distinct
distinct是数据去重,返回一个数据集,numTasks是设置任务并行数量groupByKey
是数据分组操作,在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。reduceByKey
reduceByKey是数据分组聚合操作,在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集。key相同的值,都被使用指定的reduce函数聚合到一起。aggregateByKey
aggregateByKey和reduceByKey的不同在于,reduceByKey输入/输出都是(K,V);而aggreateByKey输出是(K,U),可以不同于输入(K,V)combineByKey
combineByKey是对RDD中的数据集按照key进行聚合操作。聚合操作的逻辑是通过自定义函数提供给combineByKey。sortByKey
sortByKey是排序操作,对(K,V)类型的数据按照K进行排序,其中K需要实现Ordered方法。第一个参数是ascending,默认true,升序。第二个参数是numTasks,即并行任务数join
join是连接操作,将输入数据集(K,V)和另外一个数据集(K,W)进行join,得到(K,(V,W));该操作是对于相同K的V和W的集合进行笛卡尔积操作,也即V和W的所有组合。cogroup
cogroup是将输入数据集(K,V)和另外一个数据集(K,W)进行cogroup,得到一个格式为(K,Seq[V],Seq[W])的数据集cartesian
cartesian是做笛卡尔积:对于数据集T和U进行笛卡尔积操作,得到(T,U)格式的数据集pipe
pipe是以shell命令处理RDD数据randomSplit
randomSplit对RDD按照权重进行数据分割,第一个参数为分割权重数组,第二个参数为随机种子,该方法用于样本划分中subtract
subtract是对RDD进行减法操作,将输入的rdd中的元素减去other中包含的元素。zip
zip是对两个RDD进行拉链操作,拉链操作还包括:zipWithIndex,zipPartitionscoalesce
coalesce是将RDD进行重分区,默认不进行shuffle,且该RDD的分区个数等于numPartitions个数repartition
repartition是将RDD进行重分区,调整分区数量为numPartitions,会进行shuffletreeAggregate
treeAggregate是采用多层树模式进行RDD的聚合操作,类似于aggreateByKey。三个参数如下zeroValue: U,初始值,比如空列表
seqOp:(U,T)=>U,seq操作符,描述如何将T合并入U,比如如何将item合并到列表
combOp:(U,U)=>T,comb操作符,描述如何合并两个U,比如合并两个列表
Action 执行
返回结果到Driver程序,一般意味着RDD计算的结束。
reduce
reduce是对数据集的所有元素执行聚集函数,该函数必须是可交换的collect
collect是将数据集中的所有元素以一个array的形式返回count
返回数据集中元素的个数first
返回数据集中的第一个元素take
take返回一个包含数据集中前n个元素的数组,当前该操作不能并行takeSample
takeSample返回包含随机的num个元素的数组。和Sample不同,takeSample是行动操作,所以返回的是数组而不是RDD。其中,第一个参数withReplacement是抽样时是否放回;第二个参数num会精确指定抽样数,而不是比例;第三个参数seed是随机种子,返回数组时,会进行随机排序takeOrdered
takeOrdered时返回包含随机的n个元素的数组,按照顺序输出saveAsTextFile
把数据集中的元素写到一个文本文件,Spark会对每个元素调用toString方法来把每个元素存成文本文件的一行countByKey
对于(K,V)类型的RDD,返回一个(K,Int)的map,Int为Key的个数foreach
foreach是对数据集中的每个元素都执行func函数