scala - Spark中的分层采样

标签 scala apache-spark

我有包含用户和购买数据的数据集。这是一个示例,其中第一个元素是 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% 进行采样(您可能想查看 kFoldMLUtils 中的 BernoulliCellSampler)。然后,您可以将输入数据过滤为您想要的一组 ID。

对于#2,您可以查看 BernoulliCellSampler并直接应用它。

关于scala - Spark中的分层采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32238727/

相关文章:

design-patterns - 我们可以在运行时为 Scala 类分配/更改特征吗?如何 - 任何示例代码? Like Strategy Pattern (Gang of four Design Pattern)

scala - 如何使路由方法在 Play 2.x 子项目中起作用?

scala - 在 yarn 集群上运行时引发 ClassNotFoundException

regex - Scala:匹配特殊字符

scala - DataType.fromJSON() - java.lang.IllegalArgumentException : Failed to convert the JSON string <> to a data type

scala - 如何加载 PMML 模型?

apache-spark - 如何使用 Kubernetes 在 spark 集群中调度作业

macos - Mac 上的 Spark Shell "Failed to Initialize Compiler"错误

python - 无法在 Spark 上运行 TensorFlow

apache-spark - UDF 的 pyspark 中的返回类型无效