Spark核心算子

139 阅读2分钟
`Value`map  mapPartitions  mapPartitionsWithIndex  flatMap  glom  groupBy  filter  sample
coalesce   repartition   sortBy
`双Value`:  intersection  union   subtract  zip
`Key-Value`:  partitionBy  reduceByKey  groupByKey  aggregateByKey  foldByKey  combineByKey 
`sortByKey`  join  leftOuterJoin  `cogroup`
`行动算子`:reduce  collect  count  first  take  takeOrdered  aggregate  fold  countByKey  
save相关的算子 saveAsTextFile  saveAsObjectFile  saveAsSequenceFile  foreach

spark中,shuffle操作必须落盘处理,否则可能导致内存溢出,所有shuffle性能非常低

val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("RDD")

val sc = new SparkContext(sparkConf)

map

1.png

mapPartitionsWithIndex:在处理的同时可以获得当前分区索引

  • 只保留第二个分区的数据

1.png

1.png

flatMap:扁平映射

2.png

1.png

  • List(List(1,2),3,List(4,5))进行扁平化映射

1.png

glom()

  • 返回值 RDD[Array[T]]
  • 将同一个分区的数据直接转换为相同类型的内存数组进行处理,分区不变

1.png

小功能:计算所有分区最大值求和(分区内取最大值,分区间最大值求和)

1.png

groupBy

  • groupBy(分组规则)

2.png 输出结果:有两个分组

1.png

相同的字母放到同一个分组 1.png 输出结果

2.png

fliter

  • 筛选后,分区不变,生产环境下,过滤之后可能产生数据倾斜
  • fliter()

sample

根据指定的规则从数据集中抽取数据

distinct:去重

1.png

coalesce:缩减分区

1.png

2.png

  • coalesce:不会将数据打乱重新组合,相同分区的数据只能放到同一个分区
  • 可能会出现数据倾斜
  • 把第二个参数设置为true,可进行shuffle,默认为false

1.png

1.png

扩大分区(不建议使用)

必须要使用shuffle,否则不起作用 不进行shuffle

1.png

2.png

repartition:扩大分区

1.png

sortBy(排序规则,false降序:默认升序)

  • String按照字典序排序
  • 存在shuffle操作

1.png

双value操作:交集|并集|差集|拉链

交集:intersection

并集:union:并集不去重

差集:subtract

1.png

拉链:zip,将相同位置上的数据拉到一块

交集|并集|差集数据类型必须相同,而拉链可以拉取数据类型不相同的数据源 1.png

  • 拉链的两个数据源分区数量必须要一致
  • 每个分区数量必须相同 => 数据源里数据量相同

K-V类型

partitionBy

reduceByKey:两两聚合

aggregateByKey

1.png

  • aggregateByKey的返回值类型由初始值决定的
  • aggregate(传入的类型决定最终的返回类型)( )

1.png

join

1.png

1.png

2.png

cogroup

  • 将来自不同数据源的相同key的数据合并成集合
  • 匹配不到的key也会输出
  • 使用CompactBuffer集合存储两个RDD中的数据

1.png 2.png