Spark需要一个带有大论点的RDD.take。结果应该是RDD

时间:2016-06-01 09:28:17

标签: scala apache-spark

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

编辑:一个解决方案可能是zipWithIndex和过滤器索引< aBigValue但我很确定有更好的解决方案。

编辑2:代码就像

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

减少RDD的大小是很多操作: - (

2 个答案:

答案 0 :(得分:1)

我实际上非常喜欢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位,这个功能比你的接送/压缩和过滤器快得多

答案 1 :(得分:0)

解决方案:

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

如果你想要近似值,请参考GameOfThrows'solution