Spark API 之 takeSample(boolean, sampleNum,seed) 详解

java面试题网站:www.javaoffers.com

takeSample(boolean, sampleNum,seed):该函数是抽取随机数。

前言:很重要,不然你不会理解seed的作用。

用算法进行算出的结果为伪随机数,因为算法是固定的,只是我们在改变其参数而已,要知道在java中的Random类产生的数就是伪随机数,底层有一套自己的算法,该算法依靠seed(种子)参数,如果种子一样得到的结果也一样,而我们通常在开发中大部分是使用 new Random() 方法(另外一个构造方法是:new Random(seed)),此构造没有seed参数,底层代码为:

public Random() {
this(seedUniquifier() ^ System.nanoTime());

 

}

seedUniquifier()这个方法中存在固定的值为: 8682522807148012L * 181783497276652981L

System.nanoTime(): 取出当前的纳秒值机数(重复的概率很小)这个值很关键,因为这个值改变,产生的随机值也在改变(因为算法是固定的)。该值充当了seed参数,

所以Random产生的随机值是伪随机值。真正的随机数比如,水波波纹密度,天空中的风的每分钟风速,即大自然的不受人控制的变化的,

言归正传:

boolean: 该参数对应true和false,分别对应两种算法(两种抽取器),底层代码为:if (withReplacement) {        new PartitionwiseSampledRDD[T, T](this, new PoissonSampler[T](fraction), true, seed)      } else {        new PartitionwiseSampledRDD[T, T](this, new BernoulliSampler[T](fraction), true, seed)      } 这两种算法分别为:PoissonSampler 和 BernoulliSampler

sampleNum: 为要随机抽取多少个在Rdd的元素

seed : 即种子,在算法中充当着随机参数,根据随机参数的不同,最后产生的结果不同,seed参数相同,使用的算法boolean也相同,

则最后的结果也是相同的,所以说takeSample是一个伪随机数。此时你要深刻理解前言所说的。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值