【问题标题】:Remove Empty Partitions from Spark RDD从 Spark RDD 中删除空分区
【发布时间】:2016-01-21 12:40:00
【问题描述】:

我正在从 HDFS 获取数据并将其存储在 Spark RDD 中。 Spark 根据 HDFS 块的数量创建分区数量。这会导致大量空分区,这些分区也会在管道期间进行处理。为了消除这种开销,我想从 RDD 中过滤掉所有的空分区。我知道合并和重新分区,但不能保证所有空分区都会被删除。

还有其他方法可以解决这个问题吗?

【问题讨论】:

  • "这会导致大量的空分区,在管道过程中也会被处理" 这句话我没看懂。为什么以及何时创建这些空分区?
  • 假设我正在使用 Hive 获取数据,并且我的 hdfs 有 500 个给定 Hive 表的文件块,在这种情况下,将在 RDD 中创建 500 个分区。稍后在执行 groupbykey 时,会留下空分区。
  • 如果您对数据有一些先验知识,您可以使用RangePartitionerHashPartitioner 重新分区。如果没有,您可以使用基于随机数的分区。
  • 我会说空分区会自动删除并且Spark不会处理,虽然我不是100%肯定。
  • @MikelUrkia 空分区不会被删除(您可以在 Spark UI 中看到它们)。但是,在执行repartition... 之后,我从未经历过空分区

标签: hadoop apache-spark pyspark rdd


【解决方案1】:

没有一种简单的方法可以简单地从 RDD 中删除空分区。

coalesce 不保证会删除空分区。如果你的 RDD 有 40 个空白分区和 10 个有数据的分区,rdd.coalesce(45) 之后仍然会有空分区。

repartition 方法将数据均匀地拆分到所有分区上,因此不会有任何空分区。如果你有一个有 50 个空白分区和 10 个有数据的分区的 RDD 并运行rdd.repartition(20),数据将均匀地分布在 20 个分区中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2020-09-18
    • 2016-01-04
    相关资源
    最近更新 更多