2017-03-22 33 views
10

我想一个RDD转换成数据帧,并希望缓存RDD结果:缓存下令星火据帧产生不必要的工作

from pyspark.sql import * 
from pyspark.sql.types import * 
import pyspark.sql.functions as fn 

schema = StructType([StructField('t', DoubleType()), StructField('value', DoubleType())]) 

df = spark.createDataFrame(
    sc.parallelize([Row(t=float(i/10), value=float(i*i)) for i in range(1000)], 4), #.cache(), 
    schema=schema, 
    verifySchema=False 
).orderBy("t") #.cache() 
  • 如果不使用cache功能没有工作是产生。
  • 如果使用cache只有orderBy 1个作业后为cache产生:enter image description here
  • 如果使用不产生工作只有parallelizecache

为什么cache在这种情况下会生成一份工作? 如何避免cache(缓存DataFrame和RDD)的作业生成?

编辑:我调查了更多的问题,发现没有orderBy("t")没有工作生成。为什么?

+0

随着您的更新澄清问题,我删除了我原来的答案。这是一个有趣的问题,因为orderBy(“t”)被懒惰地评估,因为它应该是和cache()没有orderBy也懒惰地评估,但一起,我也不知道为什么有什么执行纯粹的变压器操作。 – Garren

回答

1

我提交了bug ticket,它与以下原因关闭:

缓存需要后盾RDD。这要求我们也知道 后备分区,并且这对全球订单有点特殊: 它会触发作业(扫描),因为我们需要确定分区 范围。