PySpark partitionBy,重新分区,还是什么都没有?

时间:2015-04-19 15:02:00

标签: python apache-spark pyspark

所以我所做的就是

rdd.flatMap(lambda x: enumerate(x))

为我的数据创建密钥0-49。然后我决定这样做:

rdd.flatMap(lambda x: enumerate(x)).partitionBy(50)

我注意到发生了一些奇怪的事情,因此对于以下文件大小,10GB需要46秒才能进行计算,50GB文件需要10分31秒。我检查了文件,由于某种原因它只有4个块。

所以我所做的改变了:

sc.textFile("file", 100)

我删除了分区,50GB文件下降到大约1分钟。我想知道在加载后尝试重新分区数据是否仍然有意义?也许靠钥匙?

1 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,您会在需要额外重新分配时询问。首先,您应该记住,重新分配是expensive operation。明智地使用它。其次,没有严格的答案,而且还有经验。但是一些常见的情况是:

  1. 您可以尝试在repartition之前的日期致电join, leftOuterJoin, cogroup...。有时它可以加快计算速度。

  2. flatMap将您的数据加入更多"重量级"数据并遇到Java heap space Exception java.lang.OutOfMemoryError。那么你当然应该让你的分区更小,以适应flatMap之后的数据。

  3. 您将数据加载到database \ mongoDb \ elasticSearch ...您在数据上调用repartition,然后在forEachPartition代码块内部将所有这些分区批量插入到数据库中。所以这些块的大小应该是合理的。