📅  最后修改于: 2023-12-03 15:18:51.388000             🧑  作者: Mango
在 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 中的简单随机抽样和分层抽样的介绍。