2015-10-22 120 views
7

我從HDFS中獲取數據並將其存儲在Spark RDD中。 Spark根據HDFS塊的數量創建分區數量。這導致大量的空分區在管道中也被處理。爲了消除這種開銷,我想過濾掉RDD中的所有空分區。我知道聚結和重新分區,但不能保證所有空分區都將被刪除。從Spark中刪除空分區RDD

有沒有其他辦法可以解決這個問題?

+0

「*這導致大量的空分區也在管道系統中處理*」我不明白這句話。爲什麼以及何時創建這個空分區? –

+0

假設我使用Hive獲取數據,並且我的hdfs有500個給定Hive表的文件塊,那麼將會在RDD中創建500個分區。稍後在做groupbykey時,會留下空的分區。 – user3898179

+1

如果您有關於數據的一些先驗信息,您可以使用RangePartitioner或HashPartitioner進行重新分區。如果沒有,您可以使用基於隨機數的分區。 – zero323

回答

1

沒有簡單的方法來簡單地從RDD中刪除空分區。

​​3210不保證空分區將被刪除。如果您的RDD包含40個空白分區和10個包含數據的分區,則在rdd.coalesce(45)之後仍會有空分區。

repartition方法在所有分區上均勻分割數據,因此不會有任何空分區。如果您擁有一個包含50個空白分區和10個包含數據的分區的RDD,並運行rdd.repartition(20),則數據將平均分配到20個分區。