spark tranformation及action总结

Spark创建RDD分为三种:从集合中创建RDD;从外部存储创建RDD;从其他RDD创建。

RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。从编程的角度来看,RDD可以简单看成是一个数组。和普通数组的区别是,RDD中的数据是分区存储的,这样不同分区的数据就可以分布在不同的机器上,同时可以被并行处理。因此,Spark应用程序所做的无非是把需要处理的数据转换为RDD,然后对RDD进行一系列的变换和操作从而得到结果。

 

RDD提供了两种类型的操作:transformation和action。所有的transformation都是采用的懒策略,如果只是将transformation提交是不会执行计算的,计算只有在action被提交的时候才被触发。

1)transformation操作:得到一个新的RDD,比如从数据源生成一个新的RDD,从RDD生成一个新的RDD

map(func):对调用map的RDD数据集中的每个element都使用func,然后返回一个新的RDD,这个返回的数据集是分布式的数据集

mapValues顾名思义就是输入函数应用于RDDKev-ValueValue,原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。因此,该函数只适用于元素为KV对的RDD。

mapWith是map的另外一个变种,map只需要一个输入函数,而mapWith有两个输入函数。第一个函数是把RDD的partition index(index0开始)作为输入,输出为新类型A;第二个函数是把二元组(T, A)作为输入(其中T为原RDD中的元素,A为第一个函数的输出),输出类型为U。

mapPartitions(func):和map很像,但是map是每个element,而mapPartitions是每个partition

mapPartitionsWithSplit(func):和mapPartitions很像,但是func作用的是其中一个split上,所以func中应该有index

mapPartitionsWithIndex(func)函数:mapPartitionsWithIndex的func接受两个参数,第一个参数是分区的索引,第二个是一个数据集分区的迭代器。而输出的是一个包含经过该函数转换的迭代器。下面测试中,将分区索引和分区数据一起输出。

sample(withReplacement,faction,seed):抽样,withReplacement为true表示有放回;faction表示采样的比例;seed为随机种子

takeSample() 函数和上面的sample 函数是一个原理,但是不使用相对比例采样,而是按设定的采样个数进行采样,同时返回结果不再是RDD,而是相当于对采样后的数据进行Collect(),返回结果的集合为单机的数组。

filter(func) : 对调用filter的RDD数据集中的每个元素都使用func,然后返回一个包含使func为true的元素构成的RDD

flatMap(func):和map差不多,但是flatMap生成的是多个结果

flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为KV对的RDD中Value。每个一元素的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。

flatMapWith与mapWith很类似,都是接收两个函数,一个函数把partitionIndex作为输入,输出是一个新类型A;另外一个函数是以二元组(T,A)作为输入,输出为一个序列,这些序列里面的元素组成了新的RDD。

union(otherDataset):返回一个新的dataset,包含源dataset和给定dataset的元素的集合

distinct([numTasks]):返回一个包含源数据集中所有不重复元素的新数据集

groupByKey(numTasks):返回(K,Seq[V]),也就是hadoop中reduce函数接受的key-valuelist

reduceByKey(func,[numTasks]):就是用一个给定的reducefunc再作用在groupByKey产生的(K,Seq[V]),比如求和,求平均数

sortBy (dataSet, boolean)函数:排序。第二个参数默认为true,即升序排序。

sortByKey([ascending],[numTasks]):按照key来进行排序,是升序还是降序,ascending是boolean类型

join(otherDataset,[numTasks]):当有两个KV的dataset(K,V)和(K,W),返回的是(K,(V,W))的dataset,numTasks为并发的任务数。本质是通过cogroup 算子先进行协同划分,再通过flatMapValues 将合并的数据打散。

cogroup(otherDataset,[numTasks]):当有两个KV的dataset(K,V)和(K,W),返回的是(K,Seq[V],Seq[W])的dataset,numTasks为并发的任务数

cartesian(otherDataset):笛卡尔积就是m*n,大家懂的

coalesce(numPartitions,true)函数:对RDD中的分区重新进行合并。返回一个新的RDD,且该RDD的分区个数等于numPartitions个数。如果shuffle设置为true,则会进行shuffle。

repartition(numPartitions)随机重新shuffleRDD中的数据,并创建numPartitions个分区。此操作总会通过网络来shuffle全部数据

pipe(command, [envVars])通过POSIX 管道来将每个RDD分区的数据传入一个shell命令(例如Perl或bash脚本)。RDD元素会写入到进程的标准输入,其标准输出会作为RDD字符串返回。

 

2)action操作:action是得到一个值,或者一个结果(直接将RDDcache到内存中)

reduce(func):说白了就是聚集,但是传入的函数是两个参数输入返回一个值,这个函数必须是满足交换律和结合律的

collect():一般filter或者足够小的结果的时候,再用collect封装返回一个数组

count():返回的是dataset中的element的个数

first():返回的是dataset中的第一个元素      类似于take(1)

take(n):返回前n个elements,这个士driverprogram返回的

takeSample(withReplacement,num,seed):抽样返回一个dataset中的num个元素,随机种子seed

takeOrdered(n, [ordering])返回一个由数据集的前n个元素组成的有序数组,使用自然序或自定义的比较器。

saveAsTextFile(path):把dataset写到一个text file中,或者hdfs,或者hdfs支持的文件系统中。对于每个元素,Spark将会调用toString方法,spark把每条记录都转换为一行记录,然后写到file中。

saveAsSequenceFile(path)将数据集的元素,以Hadoopsequencefile的格式,保存到指定的目录下,本地系统,HDFS或者任何其它hadoop支持的文件系统。这个只限于由key-value对组成,并实现了Hadoop的Writable接口,或者隐式的可以转换为Writable的RDD。(Spark包括了基本类型的转换,例如Int,Double,String,等等)

saveAsObjectFile(path)将数据集元素写入Java序列化的可以被SparkContext.objectFile()加载的简单格式中

countByKey():返回的是key对应的个数的一个map,作用于一个RDD

foreach(func):对dataset中的每个元素都使用func

 

3)其它 函数操作:

lookup操作:通过key找value值。Lookup 函数对(Key,Value) 型的RDD操作,返回指定Key对应的元素形成的Seq。

contains(str)函数:包含str字符串

take 和 takeAsTextFile操作

fold, foldLeft, andfoldRight之间的区别

trim函数:把字符两端的空格截掉

­ top 返回最大的 k 个元素。

­ take 返回最小的 k 个元素。

­ takeOrdered 返回最小的 k 个元素,并且在返回的数组中保持元素的顺序。

­ first 相当于top(1) 返回整个RDD中的前k 个元素,可以定义排序的方式Ordering[T]。返回的是一个含前k个元素的数组。

fold 和reduce 的原理相同,但是与reduce 不同,相当于每个reduce 时,迭代器取的第一个元素是zeroValue。

aggregate 先对每个分区的所有元素进行aggregate操作,再对分区的结果进行fold操作。aggreagate与fold 和reduce 的不同之处在于,aggregate相当于采用归并的方式进行数据聚集,这种聚集是并行化的。而在fold和reduce 函数的运算过程中,每个分区中需要进行串行处理,每个分区串行计算完结果,结果再按之前的方式进行聚集,并返回最终聚集结果。

 

4)Spark 1.4为DataFrame新增的统计与数学函数

随机数据生成(Random Data Generation)

describe函数:概要与描述性统计(Summaryand descriptive statistics)

协方差与相关性(Sample covariance and correlation)

交叉列表(Cross tabulation)

频率项(Frequent items)

数学函数(Mathematical functions)

 

scala集合操作符及操作

:: 操作符从给定的头和尾创建一个新的列表9::List(2,4)——》List(9,2,4)  也可以写作 9::2::4::Nil 注意:::操作符是右结合的,通过::操作符可以从末端构建9::(2::(4::Nil)))

|、&和&~表示union、intersect和diff方法;其中,联合(union)可以写作++,差异(diff)可以写作--,例如:Set(1,7,2,9)  union Set(2,3,5,7)——》Set(1,2,3,5,7,9)      Set(1,7,2,9)  & Set(2,3,5,7)——》Set(2,7)     Set(1,7,2,9)  -- Set(2,3,5,7)——》Set(1,9)

①向后(:+)或向前(+:)追加元素到序列中 Vector(1,2):+5   =》Vector(1,2,5)   5+:Vector(1,2)  =>Vector(5,1,2)

②添加(+)元素到无先后次序的集合中;用-移除元素

③用++和--来批量添加和移除元素

④对于列表,优先使用:::::

⑤改值操作有+=、++=、-=和--=

⑥对于集合,更喜欢++、&和--; 尽量不用++: +=:  和++=:

注意:+和-都是指元素与集合的操作,++和--都是指集合与集合的操作;+用于将元素添加到无先后顺序的集合,而+:和:+则是将元素添加到有先后次序的集合的开头或末尾;模式匹配(case h::t) 不认+:操作符;:::等同于++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值