Spark需要一个带有大论据的RDD.take.结果应为 RDD



有没有像take这样的RDD方法,但它不能获取内存中的所有元素。例如,我可能需要获取RDD的10^9个元素并将其保留为RDD。最好的方法是什么?

编辑:一个解决方案可能是zipWithIndex并使用索引<aBigValue进行过滤,但我很确定有更好的解决方案。>

编辑2:代码将像

sc.parallelize(1 to 100, 2).zipWithIndex().filter(_._2 < 10).map(_._1)

为了减小RDD的大小,需要很多操作:-(

我实际上非常喜欢zipWithIndex +过滤机制,但是如果您正在寻找有时更快,我建议您使用sample函数,如下所述:https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/rdd/RDD.html

data.count
...
res1: Long = 1000
val result = data.sample(false, 0.1, System.currentTimeMillis().toInt)
result.count
...
res2: Long = 100
Sample 获取整个 RDD 并将其

子集化为分数并将其作为另一个 RDD 返回 - 问题是,如果您从127112310274数据行中寻找 150 个样本,那么祝您写下该分数参数好运(您可以尝试 150/data.length) - 但如果您粗略地查找数据的 1-10,此函数的工作方式比您的获取/删除或压缩和过滤要快得多

一个解决方案:

yourRDD.zipWithIndex().filter(_._2 < ExactNumberOfElements).map(_._1)

如果你想要一个近似值,请采用GameOfThrows的解决方案

最新更新