强迫转型在坚持之前不起作用

时间:2018-03-01 17:29:50

标签: scala apache-spark

我需要在保留数据帧之前执行过滤器。为了强制执行此操作,我在过滤器+持久化后尝试了count()。当数据帧读取(Step 2)持久化(跳过任务)时,每次执行步骤4中的循环时都会执行相应的过滤器(filter #1)。

假设

我错了
  1. filter #1在执行之前执行?
  2. count将触发read->filter->persist
  3. 的执行

    我想强制过滤器在持久化之前执行一次,因为在Step 4的每次迭代中遍历过滤器列表是一个非常昂贵的过程。

    Step 1
    val dataFrame2 = readData(sparkSession, paths)
    .
    .
    .
    Step 2
    val dataFrame1 = readData(sparkSession, paths)
    .filter(col("field1").isin(listOfRequiredVals: _*))//filter #1
    .persist(StorageLevel.MEMORY_AND_DISK_SER_2)
    
    dataFrame1.count()
    .
    .
    .
    .
    Step 3
    val dataFrame4  = dataFrame2.filter(col("field2") === lit(52)) filter #2
    .join(broadcast(dataFrame3), Seq("field3", "field4"))
    .persist(StorageLevel.MEMORY_AND_DISK_SER_2)
    
    Step 4
    while( i > x) {
         dataFrame4.join(dataFrame2, "fieldX").write.parquet("path")
         i += 1
    }
    

    更新1:

    1. 更新了解释,并引用了正确的过滤器#。
    2. 由于过滤器#2的更改在Step 3中保留,filter #1中的Step 2在保留之前无法执行。

1 个答案:

答案 0 :(得分:0)

这里的问题是需要一个MVCE,但我相信我已经找到了问题所在。对unpersist()的调用是在join之后(标记了持久化数据帧的结束),但在一个沿袭触发之前 - write结果上的join之前。因此,尽管在持久化之后放置了一个计数操作(在write之前通过单独取消它而无意识地使其失效,所以谱系包括再次读取文件。