Spark 采样
是一种从数据集获取随机采样记录
的机制,当您拥有较大的数据集并且想要分析/测试数据子集(例如原始文件的 10%)时,这非常有用。
Spark 提供了 RDD、DataFrame
和DataSet API
上的采样方法来获取样本数据,本文将介绍如何获取随机采样记录以及如何每次运行时获取相同的随机采样,以及更多使用 scala 示例获取更多示例。
数据分析师和数据科学家最常用数据采样来获取数据集子集的统计数据,然后再将其应用于大型数据集。
dataframe 取样
val spark: SparkSession = SparkSession.builder().master("local[1]").appName("SparkByExample")
.getOrCreate();
val df: Dataset[lang.Long] = spark.range(100)
println(df.count()) //100
//取样10%,但是并不精确,比如这里某次取出来的结果就不是10个
//3,17,40,55,58,66,73,93 而是8个
val sadf: Dataset[lang.Long] = df.sample(withReplacement = false, 0.1)
println(sadf.collect().mkString(","))
取样,要求每次返回相同的结果,就需要设置种子
的值
val spark: SparkSession = SparkSession.builder().master("local[1]").appName("SparkByExample")
.getOrCreate();
val df: Dataset[lang.Long] = spark.range(100)
println(df.count()) //100
//第三个参数代表种子,可以保证每次取样都是相同的结果
//13,34,46,60,68,86,88
val sadf: Dataset[lang.Long] = df.sample(withReplacement = false, 0.1,123)
println(sadf.collect().mkString(","))
取样,如果要求可以重复
val spark: SparkSession = SparkSession.builder().master("local[1]").appName("SparkByExample")
.getOrCreate();
val df: Dataset[lang.Long] = spark.range(100)
println(df.count()) //100
//取完样后还放回去,就是可以重复取出某个元素,第一个参数设为true
//0,5,9,11,14,14,16,17,21,29,33,41,42,52,52,54,58,65,65,71,76,79,85,96
val sadf: Dataset[lang.Long] = df.sample(withReplacement = true, 0.3,123)
println(sadf.collect().mkString(","))
RDD采样
val spark: SparkSession = SparkSession.builder().master("local[1]").appName("SparkByExample")
.getOrCreate();
val rdd: RDD[Long] = spark.sparkContext.range(0, 100)
//9,38,40,52,53,57,59,79,88,
//RDD也可以采用,df也可以采样!采样的结果还是个rdd
val sardd: RDD[Long] = rdd.sample(withReplacement = false, 0.1, 0)
println(sardd.collect().mkString(","))
println(rdd.sample(withReplacement = true, 0.3, 123).collect().mkString(","))
规定个数而非规定比例进行取样
val spark: SparkSession = SparkSession.builder().master("local[1]").appName("SparkByExample")
.getOrCreate();
val rdd: RDD[Long] = spark.sparkContext.range(0, 100)
//takeSample也可以取样,不过返回值不是rdd,是array,另外,第二个参数直接规定取样的个数
//67,96,29,46,34,51,0,40,52,76
val sardd: Array[Long] = rdd.takeSample(withReplacement = false, 10, 123)
println(sardd.mkString(","))
总结
rdd
和dataframe
都可以进行取样- 取样可以设置
比例
,是否放回
等等 - 取样可以用于
数据倾斜
的预估