我有包含用户和购买数据的数据集。这是一个示例,其中第一个元素是 userId,第二个是 productId,第三个表示 bool 值。
(2147481832,23355149,1)
(2147481832,973010692,1)
(2147481832,2134870842,1)
(2147481832,541023347,1)
(2147481832,1682206630,1)
(2147481832,1138211459,1)
(2147481832,852202566,1)
(2147481832,201375938,1)
(2147481832,486538879,1)
(2147481832,919187908,1)
...
我想确保我只获取每个用户数据的 80% 并构建一个 RDD,而剩下的 20% 并构建另一个 RDD。让我们调用训练和测试。我想远离使用 groupBy 开始,因为它会产生内存问题,因为数据集很大。最好的方法是什么?
我可以做以下事情,但这不会给每个用户的 80%。
val percentData = data.map(x => ((math.random * 100).toInt, x._1. x._2, x._3)
val train = percentData.filter(x => x._1 < 80).values.repartition(10).cache()
最佳答案
像这样的东西可能非常适合像“Blink DB”这样的东西,但让我们看看这个问题。有两种方法可以解释您所问的一种是:
1) 你想要 80% 的用户,你想要他们的所有数据。
2) 你想要每个用户数据的 80%
对于#1,您可以做一个映射来获取用户 ID,调用 distinct,然后对其中的 80% 进行采样(您可能想查看 kFold
或 MLUtils
中的 BernoulliCellSampler
)。然后,您可以将输入数据过滤为您想要的一组 ID。
对于#2,您可以查看 BernoulliCellSampler
并直接应用它。
关于scala - Spark中的分层采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238727/