Spark中传递DataFrame给函数或赋值新变量会引发数据复制吗?
Spark DataFrame函数传递的性能问题解析
先看你给出的示例代码:
def transform(myDF: DataFrame) (implicit spark: SparkSession): DataFrame = { // do something } val myDf1 = spark.read.format("avro").load("hdfs://myavrofile") val myDf2 = transform(myDf1)
问题解答
- 这段代码没有任何性能低效问题,完全不用担心数据复制的开销。
- Spark里的DataFrame根本不是存储实际数据的容器,它本质是一份执行计划的抽象描述,记录的是你要对数据执行的一系列操作逻辑,而非数据本身。
- 当你把
myDf1传入transform函数时,传递的只是这个执行计划对象的引用(类似你说的指针),没有任何实际数据被复制或拷贝。 - 执行
val myDf2 = transform(myDf1)后,myDf2只是在myDf1的执行计划基础上,追加了transform函数里定义的操作逻辑,生成了一份新的执行计划抽象。只有当你触发count、show、write这类action操作时,Spark才会真正解析整个执行计划,做优化后再去实际处理数据。 - 这种封装DataFrame操作的写法完全符合Spark的设计逻辑,是日常开发中很常见的写法,不存在性能损耗。
内容的提问来源于stack exchange,提问作者olaf
相关产品推荐
相关产品推荐

