代码之家  ›  专栏  ›  技术社区  ›  DK2

持久化后两次spark-RDD过程

  •  1
  • DK2  · 技术社区  · 7 年前

    val RDD2 = RDD1.map({
      println("RDD1")
      ....
    }).persist(StorageLevel.MEMORY_AND_DISK)
    
    RDD2.foreach({
      println("RDD2")
      ...
    })
    ...so on..
    

    我希望RDD1的进程只执行一次,因为RDD1是通过persist方法保存在内存或磁盘上的。

    但不知何故,“RDD1”是在“RDD2”之后打印的,如下所示。

    RDD1
    RDD1
    RDD1
    RDD1
    RDD2
    RDD2
    RDD2
    RDD2
    RDD2
    RDD1 -- repeat RDD1 process. WHY? 
    RDD1
    RDD1
    RDD1
    RDD2
    RDD2
    RDD2
    RDD2
    RDD2
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Avishek Bhattacharya    7 年前

    这是spark的预期行为。像大多数操作一样,spark中的persistent也是惰性操作。因此,即使为第一个RDD添加持久化,spark也不会缓存数据,除非在持久化操作之后添加任何操作。映射操作不是spark中的操作,它也是惰性的。

    强制缓存的方法是添加 count 持久化后的行动 RDD2

    val RDD2 = RDD1.map({
       println("RDD1")
       ....
    }).persist(StorageLevel.MEMORY_AND_DISK)
    
    RDD2.count // Forces the caching 
    

    现在,如果您执行任何其他操作,RDD2将不会重新计算

    推荐文章