我试图从需要保持计数比率的两个数据帧中取出样本。例如
df1.count() = 10
df2.count() = 1000
noOfSamples = 10
我想以这样的方式对数据进行采样:我得到10个样本,每个样本的大小为101(df1为1,df2为100)
现在,这样做时
var newSample = df1.sample(true, df1.count() / noOfSamples)
println(newSample.count())
这里的分数表示什么?可以大于1吗?我检查了this和this,但无法完全理解它。
无论如何,我们还可以指定要采样的行数吗?
最佳答案
fraction
参数表示将要返回的数据集的近似分数。例如,如果将其设置为0.1
,将返回10%(1/10)的行。对于您的情况,我相信您想执行以下操作:
val newSample = df1.sample(true, 1D*noOfSamples/df1.count)
但是,您可能会注意到
newSample.count
每次运行时都会返回不同的数字,这是因为fraction
将是随机生成的值的阈值(如您所见here),因此结果数据集大小可能会有所不同。解决方法可以是:val newSample = df1.sample(true, 2D*noOfSamples/df1.count).limit(df1.count/noOfSamples)
一些可伸缩性观察
您可能会注意到,执行
df1.count
可能会很昂贵,因为它会评估整个DataFrame,并且您首先会失去采样的好处之一。因此,根据您的应用程序的上下文,您可能希望使用总样本数为的已知或近似值。
val newSample = df1.sample(true, 1D*noOfSamples/knownNoOfSamples)
或者假设您的DataFrame的大小很大,我仍然会使用
fraction
并使用limit
来强制采样数量。val guessedFraction = 0.1
val newSample = df1.sample(true, guessedFraction).limit(noOfSamples)
关于您的问题:
否。它表示0到1之间的一个分数。如果将其设置为1,它将带来100%的行,因此将其设置为大于1的数字是没有意义的。
您可以指定比所需的行数更大的分数,然后使用limit,如第二个示例所示。也许还有另一种方法,但这是我使用的方法。
关于apache-spark - Apache Spark中的数据框示例斯卡拉,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37416825/