Spark算子
- Map 对原数据进行处理,类似于遍历操作,转换成MappedRDD,原分区不变.
- flatMap 将原来的RDD中的每一个元素通过函数转换成新的元素,将RDD的每个集合中的元素合并成一个集合.比如一个元素里面多个list,通过这个函数都合并成一个大的list,最经典的就是wordcount中将每一行元素进行分词以后成为,通过flapMap变成一个个的单词,line.flapMap(.split(“ ”)).map((,1))如果通过map就会将一行的单词变成一个list.
- mapPartitions 对每个分区进行迭代,生成MapPartitionsRDD.
- Union 是将两个RDD合并成一个.使用这个函数要保证两个RDD元素的数据类型相同,返回的RDD的数据类型和被合并的RDD数据类型相同.
- Filter 其功能是对元素进行过滤,对每个元素调用f函数,返回值为true的元素就保留在RDD中.
- Distinct 对RDD中元素进行去重操作.
- Subtract 对RDD1中取出RDD1与RDD2交集中的所有元素.
- Sample 对RDD中的集合内元素进行采样,第一个参数withReplacement是true表示有放回取样,false表示无放回.第二个参数表示比例,第三个参数是随机种子.如data.sample(true, 0.3,new Random().nextInt()).
- takeSample 和sample用法相同,只不第二个参数换成了个数.返回也不是RDD,而是collect.
- Cache 将RDD缓存到内存中.相当于persist(MEMORY_ONLY).可以通过参数设置缓存和运行内存之间的比例,如果数据量大于cache内存则会丢失.
- Persist 里面参数可以选择DISK_ONLY/MEMORY_ONLY/MEMORY_AND_DISK等,其中的MEMORY_AND_DISK当缓存空间满了后自动溢出到磁盘.
- MapValues 针对KV数据,对数据中的value进行map操作,而不对key进行处理.
- reduceByKey 针对KV数据将相同key的value聚合到一起.与groupByKey不同,会进行一个类似mapreduce中的combine操作,减少相应的数据IO操作,加快效率.如果想进行一些非叠加操作,我们可以将value组合成字符串或其他格式将相同key的value组合在一起,再通过迭代,组合的数据拆开操作.
- groupByKey 对每个key进行操作,但只生成一个sequence。需要特别注意“Note”中的话,它告诉我们:如果需要对sequence进行aggregation操作(注意,groupByKey本身不能自定义操作函数),那么,选择reduceByKey/aggregateByKey更好。这是因为groupByKey不能自定义函数,我们需要先用groupByKey生成RDD,然后才能对此RDD通过map进行自定义函数操作。
- partitionBy 可以将RDD进行分区,重新生成一个ShuffleRDD,进行一个shuffle操作,对后面进行频繁的shuffle操作可以加快效率.
- randomSplit 对RDD进行随机切分.如data.randomSplit(new double[]{0.7, 0.3})返回一个RDD的数组.
- Cogroup 对两个RDD中的KV元素,每个RDD中相同key中的元素分别聚合成一个集合.与reduceByKey不同的是针对两个RDD中相同的key的元素进行合并.
- Join 相当于inner join.对两个需要连接的RDD进行cogroup,然后对每个key下面的list进行笛卡尔积的操作,输出两两相交的两个集合作为value. 相当于sql中where a.key=b.key.
- leftOutJoin/rightOutJoin 在数据库中左连接以左表为坐标将表中所有的数据列出来,右面不存在的用null填充.在这里面对join的基础上判断左侧的RDD元素是否是空,如果是空则填充.右连接则相反.
- saveAsTextFile 将数据输出到HDFS的指定目录.
- saveAsObjectFile 写入HDFS为SequenceFile格式.
- Collect/collectAsMap 将RDD转换成list或者Map.结果以List或者HashMap的方式输出.
- Count 对RDD的元素进行统计,返回个数.
- Top(k) 返回最大的k个元素,返回List的形式.
- Take 返回数据的前k个元素.
- takeOrdered 返回数据的最小的k个元素,并在返回中保持元素的顺序.