Python 是";getNumPartitions";昂贵的手术?
我正在使用Python 是";getNumPartitions";昂贵的手术?,python,python-2.7,apache-spark,pyspark,spark-dataframe,Python,Python 2.7,Apache Spark,Pyspark,Spark Dataframe,我正在使用pyspark,我调用getNumPartitions()来查看是否需要重新分区,这会大大降低我的代码速度。代码太大,无法在此处发布。我的代码是这样工作的: 我有一个for循环,它通过一系列函数循环,这些函数将应用于DataFrame 很明显,这些都是延迟应用的,所以它们直到for循环结束时才被应用 其中许多函数是withColumn函数,或pivot函数,如下所示: 在每次迭代中,我通过getNumPartitions() 我的印象是,这不是一个昂贵的操作…我是否理解错误,它实际
pyspark
,我调用getNumPartitions()
来查看是否需要重新分区
,这会大大降低我的代码速度。代码太大,无法在此处发布。我的代码是这样工作的:
- 我有一个
循环,它通过一系列函数循环,这些函数将应用于for
DataFrame
- 很明显,这些都是延迟应用的,所以它们直到for循环结束时才被应用
- 其中许多函数是
函数,或withColumn
函数,如下所示:pivot
- 在每次迭代中,我通过
getNumPartitions()
我的印象是,这不是一个昂贵的操作…我是否理解错误,它实际上是昂贵的?还是有其他东西在减慢我的代码速度?查看源代码以查找
getNumPartitions()
def getNumPartitions(self):
return self._jrdd.partitions().size()
它不应该那么贵。我怀疑是其他原因导致了你的减速
以下是我所知道的:
- 分区列表是缓存的,因此只有第一次调用
时才会计算分区partitions()
- Spark无论如何都必须为每个RDD计算分区,因此它不应该为您查询计数增加任何时间
getNumPartitions()
减慢了速度吗?或者您现在正在以不同的方式重新分区?我只调用getNumPartitions()
。我根本没有重新分配……好吧,没那么贵,至少这不是“解雇”一个有火花的工作。但根据我的经验,这很容易需要10-20秒。这是否取决于RDD/数据帧的大小?也许这就是问题所在……?根据上下文的不同,重新分区可能代价高昂,也可能几乎免费,而上下文正是本文所缺少的。请提供一份报告。