spark算子实战

spark算子

什么是算子

百度百科上对算子的解释是这样的,算子是一个函数空间到函数空间上的映射O:X→X。广义的讲,对任何函数进行某一项操作都可以认为是一个算子,甚至包括求幂次,开方都可以认为是一个算子,只是有的算子我们用了一个符号来代替他所要进行的运算罢了,所以大家看到算子就不要纠结,他和f(x)的f没区别,它甚至和加减乘除的基本运算符号都没有区别,只是他可以对单对象操作罢了(有的符号比如大于、小于号要对多对象操作)。又比如取概率P{X<x},概率是集合{X<x}(他是属于实数集的子集)对[0,1]区间的一个映射,我们知道实数域和[0,1]区间是可以一一映射的(这个后面再说),所以取概率符号P,我们认为也是一个算子,和微分,积分算子算子没区别。总而言之,算子就是映射,就是关系,就是变换

spark算子分类

从大方向来说,Spark 算子大致可以分为以下两类

  1. Transformation算子:操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有Action 操作的时候才会真正触发运算。
  2. Action算子:这类算子会触发 SparkContext 提交作业(Job),并将数据输出 Spark系统。

根据Transaction处理数据类型的不同,也可以分为三类:

  1. Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Value型的数据。
  2. Key-Value数据类型的Transformation算子,这种变换不触发提交作业,针对处理的数据项是Key-Value型的数据。
  3. Action算子,这类算子会触发SparkContext提交作业。

spark算子实战

Value数据类型的Transformation算子

算子 说明
map 将原来数据集中的每个元素经过用户自定义的函数转换为一个新的RDD(MappedRDD)
flatMap 与map类似,但每个元素输入项可以被映射到0个或多个输出项,最终将结果“扁平化”后输出
mapPartitions map的输入函数是作用于RDD中每个元素,而mapPartitions的输入函数是作用于每个分区,也就是把每个分区中的内容作为整体来处理的。
glom 将RDD的每个分区中的类型为T的元素转换为数组Array[T]。
union 将两个RDD中的数据集进行合并,最终返回两个RDD的并集,若RDD中存在相同的元素也不会去重。
cartesian 对两个RDD中的所有元素进行笛卡尔积操作。
groupBy 生成相应的key,相同的放在一起。
filter 对元素进行过滤,对每个元素应用f函数,返回值为true的元素在RDD中保留,返回为false将过滤掉。
distinct 对RDD去重。
subtract 去掉含有重复的项。
sample 对RDD内的元素进行采样,并生成一个新的RDD,这个新的RDD只有原来RDD的部分数据。用户可以设定是否有放回的抽样、百分比、随机种子,进而决定采样方式。
takeSample 上面的sample函数是一个原理,但是不使用相对比例采样,而是按设定的采样个数进行采样,同时返回结果不再是RDD,而是相当于对采样后的数据进行collect(),返回结果的集合为单机的数组。
cache、persist 都用于将一个RDD进行缓存的,这样在之后使用的过程中就不需要重复计算了,可大大节省程序运行的时间。

为了让大家更好的了解算子,我对有些算子写了两个实战例子

1. map

实例1:
scala代码

val a = sc.parallelize(List(1,2,3,4,5),3)
val b = a.map(a => a*a)
b.collect()

结果:
这里写图片描述

python代码

a = sc.parallelize([1,2,3,4,5],3)
b = a.map(lambda a:a*a)
b.collect()

结果:
这里写图片描述

实例2
scala代码

val a = sc.parallelize(List("beijing", "shanghai", "guangzhou", "shenzhen", "hangzhou"), 3)
val b = a.map(_.length)
val c = a.zip(b)
c.collect

结果:
这里写图片描述

python代码

a = sc.parallelize(["beijing", "shanghai", "guangzhou", "shenzhen", "hangzhou"], 3)
b = a.map(lambda a:len(a))
c =a.zip(b)
c.collect()

结果:
这里写图片描述

2.flatMap

实例1:
scala代码

val a = sc.parallelize(List("Hello world", "My name is Patrick"))
val b = a.flatMap(a => 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值