开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:Rdd 算子_转换_sample】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11969
Rdd 算子_转换_sample
内容介绍:
一、sample 的作用
二、sample 与 filter 的区别
三、sample 的使用
四、第一个参数:withreplacement
一、Sample 的作用
在工作中,可能会拿到一个很大的数据集,就希望是在这个数据集当中抽样出来一部分数据,那变成一个小一点的数据集,然后再去通过小的数据集来进行探索,这样的需求该怎么去实现呢?
首先这个需求有两个最重要的核心点,第一个点就是要把一个大数据集转换成这个小数据集的速度快一些。第2点需要大数据级变成小数据级的同时,同时大数据集的规律,在小数据集里面也有,尽量减少对于数据集特征的这个损失。
那么如果是这样的话,就要进行一些随机的抽样,尽可能的保留原数据的信息的同时,把一个大数据集变成小数据集,从而去增快运行速度,那么如果有这样的需求的话,那么可以试一试一个叫做 sample 的算子,本身也是采样的意思,sample 算子可以从一个数据集当中抽样出来一部分,好减少数据集,以保证运行速度,并且尽可能减少规律的损失,和这个 filter 会稍微有一点点相似,因为都是
去掉一部分数据,但是这个是随机抽样的一个过程,比如说先来看这样一张图:
二、sample 与 filter 的区别
首先这个 sample 是不需要接收任何函数,可以通过随机抽样的算法在这个数据集当中抽出了一个2,放在右边的机器当中,而 filter 是是按照一定的函数去指定过滤的规律,然后把一个大数据过滤成小数据形式,而 sample 是没有规律,是随机在进行抽样的,他们作用上也会有很大区别,这个 sample 主要是用作于随机采样,而这个 filter 的使用过滤是不一样的。
三、sample 的使用
通过编写代码来讲述 sample 的使用,打开 IDEA,定义一个 sample 的方法,在方法中第一步是定义集合,第二步是过滤数据,第三步是收集数据。
首先 sc.parallelize(Seq(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)),采用最基础的调用方式,定义出一个新的 rdd1,接下来rdd2=rdd1.sample,进入 sample 后,会发现 sample 接受三个参数,withreplacement、fraction 和 seed。这个fraction 是指采样比例,比如现有10个元素,要采样处6个元素.这个 fraction 是60%,这个 seed 是随机数的种子。seed 一般不指定,前俩个指数会指定的多一些。
eparam withReplacement canelements be sampled multiple times (replaced when sampled out) eparam fraction expected size of the sample as a fraction of this RDD's size
without replacement: probability that each element is chosen; fraction must be [0, 1]
with replacement: expected number of times each element is chosen; fraction must be greater than or equal to 0
eparam seed seed for the random number generator
@note This is NOT guaranteed to provide exactly the fraction of the count
* of the given [[RDD]].
*/
def sample(
withReplacement: Boolean,
fraction:Double,
seed: Long =Utils.random.nextLong): RDD[T] = [
require(fraction >= 0,
s"Fraction must be nonnegative, but got $ffraction")
withScope
require(fraction >= 0.0, "Negative fraction value: "+ fraction)
if (withReplacement) [
new PartitionwiseSampledRDD[T, T]( prev= this, new PoissonSampler[T](fraction), preservesPartitioning=tr )else f
new PartitionwiseSampledRDD[T, T](prev= this, new BernoulliSampler[T](fraction), preservesPartitioning =
)
四、第一个参数:withreplacement
想象一下一个米缸里面有一堆米,在里面进行随机取样,取出一粒米之后,那么这一粒米是否还在米缸中,如果在,那么下次取米的时候,还有可能会取到这一粒米。因此第一个参数 replacement 即是否有放回的抽取。
接下来去调用 sample,第一个参数是 replacement 指定为 false,接下来指定 fraction,指定为0.6。去通过 rdd2去取到 result,通过 action size 来 collect,用 result 来进行 printin item。代码完整如下:
@Test
defsample():Unit =[
// 1.定义集合
// 2.过滤数据
// 3.收集结果
valrdd1 = sc.parallelize(Seq(1,2, 3, 4, 5, 6, 7, 8, 9, 10))val rdd2 = rdd1.sample( withReplacement= false, fraction=0.6)val result = rdd2.collect()
result.foreach(item => println(item))
]
运行结果如下:
有六个数,这六个数并没有重复,因为采样出来数据之后,数据就从元数据中删除掉了,这就是因为 replacement 是false,永不放回。如果是 replacement 是有放回的,就会连续采集了三次3。
Sample 的作用是大数据变小,尽可能的减少数据集规律的损失。参数 withreplacement 为 true,是有放回的采集,为 false,是无放回的采集。