当我在内存中缓存一个不会执行操作但会被其他将执行操作的数据帧使用的数据帧时,会发生什么?
val sparkS: SparkSession = SparkSession.builder().getOrCreate()
val dataFrameA : DataFrame = sparkS.read
.option("header", "true")
.option("inferSchema", "true")
.csv(pathA)
.filter( condition ).cache()
val dataFrameB : DataFrame = sparkS.read
.option("header", "true")
.option("inferSchema", "true")
.csv(pathB)
val dataFrameC : DataFrame = sparkS.read
.option("header", "true")
.option("inferSchema", "true")
.csv(pathC)
val resultB = dataFrameB.crossJoin(dataFrameA)
resultB.count()
resultB.show()
val resutC = dataFrameC.crossJoin(dataFrameA)
resutC.count()
resutC.show()
它会缓存数据帧A吗?
是的,缓存dataFrameA
会很有帮助,因为它的输出在多个地方使用。
但退一步说,即使你不在dataFrameA
上调用一个方法,仍然可以对它执行一个操作;转换";最终以";动作";。然后,Spark将采取您提供的转换/操作的步骤,并将其转化为执行计划。调用哪些对象、哪些方法并不重要,因为只要数据用于计算,它就会出现在执行计划中。
如果您想了解Spark是如何创建执行计划的,可以对结果DataFrame使用explain()
方法。
是。
如果调用cache
,它会缓存数据帧。