本文共 1775 字,大约阅读时间需要 5 分钟。
Spark 采样是一种从数据集中获取随机采样记录的机制,特别适用于拥有较大数据集的场景。对于数据分析师和数据科学家来说,数据采样是获取数据子集统计数据的常用方法,尤其是在应用于大型数据集时。
在 Spark 中,DataFrame 的采样可以通过 sample
方法实现,该方法的实现可以指定是否放回以及随机性。以下是一个使用Scala实现的示例:
import org.apache.spark.sql.SparkSessionimport org.apache.spark.sql.Datasetval spark = SparkSession.builder().master("local[1]").appName("SparkByExample").getOrCreate()val df = spark.range(100)println(df.count()) // 输出: 100// 随机采样 10%,不放回val sadf = df.sample(withReplacement = false, 0.1)println(sadf.collect().mkString(",")) // 可能的输出示例:8,3,17,40,55,58,66,73,93// 设置随机种子以确保每次采样结果一致性val sadf = df.sample(withReplacement = false, 0.1, 123)println(sadf.collect().mkString(",")) // 输出示例:13,34,46,60,68,86,88// 允许重复抽取(有放回)val sadf = df.sample(withReplacement = true, 0.3, 123)println(sadf.collect().mkString(",")) // 输出示例:0,5,9,11,14,14,16,17,21,29,33,41,42,52,52,54,58,65,65,71,76,79,85,96
除了 DataFrame,RDD 也可以进行采样操作。一种常用的方法是使用 takeSample
方法来指定抽样的数量和是否允许重复:
import org.apache.spark.rdd.RDDimport org.apache.spark.SparkContextval spark = SparkSession.builder().master("local[1]").appName("SparkByExample").getOrCreate()val rdd = spark.sparkContext.range(0, 100)// 随机采样 10%,不放回val sardd = rdd.sample(withReplacement = false, 0.1, 123)println(sardd.collect().mkString(",")) // 输出示例:67,96,29,46,34,51,0,40,52,76// 允许重复抽取(有放回)val sardd = rdd.sample(withReplacement = true, 0.3, 123)println(sardd.collect().mkString(",")) // 输出示例:44,5,37,31,55,20,53,89,95,63
对于 RDD 或 DataFrame,若想指定抽样数量而非比例,可以直接使用 takeSample
方法:
val sardd = rdd.takeSample(withReplacement = false, 10, 123)println(sardd.mkString(",")) // 输出示例:52,27,17,37,19,65,28,93,45,83
此外,Spark 提供了丰富的采样方法,使得数据科学家能够灵活应对不同需求。
转载地址:http://akpmz.baihongyu.com/