fraction
参数代表将返回的数据集的一部分aproximate。例如,如果将其设置为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
可能是昂贵的,你会失去的好处之一首先取样。
因此,根据您的应用环境,您可能希望使用已知已知总样本数或近似值。
val newSample = df1.sample(true, 1D*noOfSamples/knownNoOfSamples)
或者假设你数据框的大小为巨大的,我仍然会用一个fraction
和使用limit
强制采样的数量。
val guessedFraction = 0.1
val newSample = df1.sample(true, guessedFraction).limit(noOfSamples)
至于你的问题:
可以在大于1?
不是。它代表一个分数,所以它必须是介于0和1之间的一个十进制数。如果将其设置为1,它将带来100%的行,因此设置它是没有意义的到一个大于1的数字。
还有无论如何我们可以指定要采样的行数?
您可以指定比想要的行数更大的部分,然后使用限制,如我在第二个示例中所示。也许有另一种方式,但这是我使用的方法。
虽然它对我来说更清晰,但是您提出的解决方案可能无法在当前场景中使用(请参阅编辑)。 df2.sample(true,noOfSample/df2.count).limit(df2.count/noOfSamples)会给我1%的数据,即10行,这将少于我需要的100行。对此有何想法? – hbabbar
@hbabbar所以你总是需要每个数据集的10%?如果是这样,你可以做'df2.sample(true,0.15).limit(0.1 * df2.count)' –