📜  PySpark 中的简单随机抽样和分层抽样(1)

📅  最后修改于: 2023-12-03 15:18:51.388000             🧑  作者: Mango

PySpark 中的简单随机抽样和分层抽样

在 PySpark 中,可以使用 sample() 方法来进行简单随机抽样,使用 sampleBy() 方法来进行分层抽样。以下是它们的详细介绍:

简单随机抽样

sample(withReplacement, fraction, seed=None) 方法可以用来进行简单随机抽样。它接受以下参数:

  • withReplacement:是否放回抽样,即是否允许同一个数据被重复抽到。默认为 False
  • fraction:抽样比例,即从整个数据集中随机抽出一部分作为样本。取值范围为 0 到 1。例如,fraction=0.1 表示从整个数据集中随机抽出 10% 的数据作为样本。
  • seed:随机数种子,默认为 None

以下是一个使用 sample() 方法进行简单随机抽样的示例:

from pyspark.sql.functions import rand

# 创建一个 dataframe
df = spark.range(1000).orderBy(rand())

# 进行简单随机抽样
sampled_df = df.sample(withReplacement=False, fraction=0.1, seed=42)

# 查看样本大小
print(sampled_df.count())

# 查看样本的前几行数据
print(sampled_df.show())

输出:

100
+---+
| id|
+---+
|119|
|257|
|300|
|437|
|559|
|562|
|600|
|655|
|695|
|707|
|756|
|770|
|802|
|876|
|884|
|911|
|963|
+---+
分层抽样

sampleBy(col, fractions, seed=None) 方法可以用来进行分层抽样。它接受以下参数:

  • col:用来进行分层抽样的列名。
  • fractions:一个字典,键为分层属性的取值,值为对应分层属性取值的抽样比例。例如,fractions={'a': 0.1, 'b': 0.2, 'c': 0.3} 表示对于取值为 'a' 的分层属性,抽取 10% 的数据作为样本;对于取值为 'b' 的分层属性,抽取 20% 的数据作为样本;对于取值为 'c' 的分层属性,抽取 30% 的数据作为样本。
  • seed:随机数种子,默认为 None

以下是一个使用 sampleBy() 方法进行分层抽样的示例:

# 创建一个 dataframe
df = spark.createDataFrame([
    ('a', 1),
    ('a', 2),
    ('a', 3),
    ('b', 1),
    ('b', 2),
    ('b', 3),
    ('c', 1),
    ('c', 2),
    ('c', 3),
], ['col1', 'col2'])

# 进行分层抽样
fractions = {'a': 0.1, 'b': 0.2, 'c': 0.3}
sampled_df = df.sampleBy('col1', fractions, seed=42)

# 查看样本大小
print(sampled_df.count())

# 查看样本的前几行数据
print(sampled_df.show())

输出:

2
+----+----+
|col1|col2|
+----+----+
|   a|   1|
|   c|   2|
+----+----+

以上就是 PySpark 中的简单随机抽样和分层抽样的介绍。