Spark:要从RDD,.take()或.filterByRange()获取N个元素吗?

时间:2018-08-01 17:03:53

标签: performance apache-spark

我有一个名为myRdd:RDD[(Long, String)]的RDD(Long是使用zipWithIndex()获得的索引),其中包含许多元素,但是我需要将其削减以得到特定数量的最终结果的元素。

我想知道哪种更好的方法:

myRdd.take(num)

myRdd.filterByRange(0, num)

我不在乎所选元素的顺序,但是我在乎性能。

有什么建议吗?还有其他方法吗?谢谢!

1 个答案:

答案 0 :(得分:3)

take是一个动作,而filterByRange是一个变换。一个动作将结果发送到驱动程序节点,并且直到调用一个动作才执行转换。

take方法将采用RDD的前n个元素,并将其发送回驱动程序。 filterByRange稍微复杂一点,因为它将采用键在指定范围内的那些元素。

我要说的是,它们之间在性能方面并没有太多差异。如果您只想将结果发送给驱动程序而不关心订单,请使用take方法。但是,如果您想受益于分布式计算,并且不需要将结果发送回驱动程序,请使用filterByRange方法,然后调用该操作。