2017-03-22 61 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。這要求我們也知道 後備分區,並且這對全球訂單有點特殊: 它會觸發作業(掃描),因爲我們需要確定分區 範圍。