Apache Spark-何时使用Map算术和MapPartitionsWithThindex?


0

pyspark文档描述了两个功能:

map部分(f,PreservesPatitioning=false)

而且…

map分区withindex(f,preserveSpartioning=false)

这些函数试图解决哪些用例?我不明白为什么需要它们。

1 答案

0

要回答这个问题,我们需要将map与mapPartitions/mapPartitionswithindex进行比较(mapPartitions和mapPartitionswithindex几乎做同样的事情,除了mapPartitionswithindex,您可以跟踪正在处理的分区)。

现在,mapPartitions和mapPartitionswithIndex用于优化应用程序的性能。为了便于理解,假设RDD中的所有元素都是XML元素,您需要一个解析器来处理它们。因此,您必须以一个好的解析器类的实例继续前进。你可以用两种方式做到:

map+for each:在本例中,对于每个元素,将创建一个解析器类的实例,处理该元素,然后及时销毁该实例,但此实例不会用于其他元素。因此,如果您使用分布在4个分区中的12个元素的RDD,那么解析器实例将被创建12次。而且,正如您所知道的,创建实例是一个非常 代价很大操作,所以这需要时间。

mapPartitions/mapPartitionsWithThindex:这两种方法可以稍微解决上述情况。mapPartitions/mapPartitionswithIndex在分区上 job,而不是在元素上 job(请不要误会,所有元素都将被处理)。这些方法将为每个分区创建一次解析器实例。由于您只有4个分区,解析器实例将被创建4次(对于本例,比map少8次)。但是您将传递给这些方法的函数应该采用迭代器对象(一次将分区的所有元素作为输入)。因此,如果存在 map分区和 map分区,将创建解析器实例,将处理当前分区的所有元素,然后GC稍后将销毁该实例。您会注意到,它们可以显著提高应用程序的性能。

因此,底线是,每当您看到某些操作对所有元素都是通用的,通常,您可以执行一次,并且可以处理所有这些操作,最好使用mapparties/mappartiswithindex。

请找到以下两个链接,以获取有关代码示例的 explain:


我来回答