是否有像取这样的RDD方法,但是没有得到内存中的所有元素。例如,我可能需要获取RDD的10 ^ 9个元素并将其保留为RDD。最好的方法是什么?
编辑:一个解决方案可能是zipWithIndex和过滤器索引< aBigValue但我很确定有更好的解决方案。
编辑2:代码就像
sc.parallelize(1 to 100, 2).zipWithIndex().filter(_._2 < 10).map(_._1)
减少RDD的大小是很多操作: - (
答案 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