Spark中存储中间数据用什么?DataFrame与TempView存中间表有何内存差异
Spark中间数据存储方案选型及DataFrame与TempView差异对比
一、Spark中间数据存储推荐方案
- 短生命周期、同任务后续阶段复用的中间数据:优先用
cache()/persist()接口,根据数据重要性、内存大小选择存储级别:- 内存充足选
MEMORY_ONLY,性能最高 - 内存不足选
MEMORY_AND_DISK,避免重复计算开销 - 容错要求高可选择带副本的级别,避免节点宕机重算
- 内存充足选
- 跨任务、跨会话需要复用的中间数据:写入分布式存储(HDFS、S3、OSS等),根据后续使用场景选存储格式:
- 后续需要结构化查询选Parquet/ORC列式存储,压缩比高查询性能好
- 需要对接其他组件可选CSV、JSON等通用格式
- 仅同SparkSession内单次临时使用的中间数据:可直接创建临时视图或赋值给DataFrame变量,不需要持久化存储
二、DataFrame与TempView存储中间表的核心区别
- 本质定位不同:
- DataFrame是Spark SQL的核心API层抽象,是分布式数据集的编程式表示,本质是携带Schema的RDD封装,绑定在SparkSession会话周期内
- TempView是Spark SQL引擎的逻辑视图抽象,本质是对对应数据集查询逻辑的别名映射,本身不持有数据
- 使用方式不同:
- DataFrame通过Scala/Python/Java等编程语言的变量引用,调用API进行后续转换处理
- TempView通过
createOrReplaceTempView()注册后,可直接在SQL语句中通过视图名引用,适合SQL风格开发
- 生命周期范围不同:
- DataFrame的生命周期和变量的引用绑定,只要变量不被垃圾回收、对应SparkSession未关闭就可以访问
- 普通TempView生命周期和创建它的SparkSession绑定,会话关闭即自动删除;全局临时视图(Global TempView)生命周期和Spark应用绑定,跨会话可访问
三、二者内存占用差异说明
二者在内存占用上没有本质差异,原因如下:
不管是赋值给DataFrame变量,还是注册为TempView,都只是对底层计算逻辑的引用,本身不会额外存储数据。只有当你主动调用
cache()/persist()对对应的数据集进行缓存时,才会真正占用内存存储计算结果,内存占用量只和你选择的存储级别、数据本身的大小有关,和你用DataFrame还是TempView引用没有关系。
举个实际示例:
// 读取数据生成DataFrame val userDF = spark.read.parquet("/path/to/user_data") // 注册为TempView userDF.createOrReplaceTempView("temp_user") // 此时不管是userDF还是temp_user都没有占用缓存内存 // 对DataFrame缓存,二者访问都会命中缓存 userDF.cache() userDF.count() // 触发缓存后,后续访问temp_user也会直接读缓存,内存占用只算1份,不会重复占用
内容的提问来源于stack exchange,提问作者Niccko
相关产品推荐
相关产品推荐

