spark-算子-sample、takeSample、sampleByKey

一、SRC

都是用来从rdd中随机抽取,sample可以根据指定的概率将rdd转为新RDD,比如设定概率为50%,返回的新RDD的行数大体是原RDD的数量的一半,这个肯定不会精确,因为即使是用(filter(Math.random() * 2).toInt == 2),也不会是严格的50%。rdd数目越大越精确。
takeSample猜测设计目的就是为了在driver端的控制台打印下rdd的数据,所以它的args1跟sample不一样,不是指定获取样本的方式,而是直接指定数目。

二、sample

1. 参数:

  1. withReplacement:元素是否被采多次,也就是是否放回,false为不放回
  2. fraction:期望样本的大小作为RDD大小的一部分,
    当withReplacement=false时:伯努利抽样模型,每个元素被选中的概率;fraction 必须是[0,1]
    当withReplacement=true时:泊松抽样模型,每个元素被选中的期望; fraction 必须大于等于0,最后的结果数量可能会大于数据源数量
  3. seed:随机数生成器的种子。建议第三个参数seed可以默认,不好把控。

2. example

 /**
   * withReplacement
   * fraction
   * seed
   */
  @Test
  def ttt4() = {
    val arr = Array[Int](0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    val sparkContext = new SparkContext(new SparkConf().setAppName("ttt").setMaster("local"))
    //sparkContext.setLogLevel("ERROR")
    //System.setProperty("hadoop.home.dir", "E:\\Program Files\\hadoop-2.7.0")
    val rdd = sparkContext.parallelize(arr)

    println(rdd.sample(false,0.5).collect().mkString(","))
    println(rdd.takeSample(false,5).mkString(","))
  }

三、sampleByKey,只有pairRDD能调用

1. 参数

sampleByKey的第二个参数是个map,key为数据源中的key,value为对应key的概率

2. example

/*
 *	key为1的概率为80%,key为2的概率为50%
 */
val inputRDD = sc.makeRDD(List((1,"a"),(2,"b"),(3,"c"),(1,"d")))
val map = Map((1 -> 0.8),(2 -> 0.5))
inputRDD.sampleByKey(true,map)

四、takeSample

1. 参数:

  1. 返回一个Array[T];
  2. 该方法仅在预期结果数组很小的情况下使用,因为所有数据都被加载到driver的内存中。
  3. takeSample猜测设计目的就是为了在driver端的控制台打印下rdd的数据,所以它的args1跟sample不一样,不是指定获取样本的方式,而是直接指定数目。

2. example

{1} 当不可以多次抽样:withReplacement=false;样本个数num大于父本个数时,只能返回父本个数

JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(6, 2, 8, 4));
List<Integer> res = rdd.takeSample(false, 8);
System.out.println(res);

//结果:[6, 8, 2, 4]

{2} 当不可以多次抽样:withReplacement=false;样本个数num小于父本个数时,返回样本个数

JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(6, 2, 8, 4));
List<Integer> res = rdd.takeSample(false, 3);
System.out.println(res);

//结果:[8, 4, 2]

{3} 当可以多次抽样:withReplacement=true;样本个数num大于父本个数时,返回样本个数

JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(6, 2, 8, 4));
List<Integer> res = rdd.takeSample(true, 8);
System.out.println(res);

//结果:[4, 6, 8, 2, 6, 2, 4, 2]

{4} 当不可以多次抽样:withReplacement=true;样本个数num小于父本个数时,返回样本个数

JavaRDD<Integer> rdd = sc.parallelize(Arrays.asList(6, 2, 8, 4));
List<Integer> res = rdd.takeSample(true, 3);
System.out.println(res);

//结果:[8, 8, 2]
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值