You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark场景下Avro与ORC格式读取内存消耗及性能差异问询

Spark读取ORC与Avro格式的内存占用差异解答

你的判断在全量字段读取、全量数据转换的场景下是完全正确的,具体分场景说明如下:

  • 全量读取+全量转换场景:两者内存消耗基本无差异
    存储层的体积差异仅来自Avro(行存)和ORC(列存+高压缩比)的存储结构、压缩策略区别,数据被Spark读取后都会被反序列化为统一的内部UnsafeRow对象格式,同一套数据的内部二进制表示完全一致,后续执行转换操作时内存占用不会有明显区别。
  • 列裁剪场景:ORC内存占用远低于Avro
    ORC是原生列存储格式,Spark读取时可以直接按需读取目标列,不需要的列完全不会被加载到内存;而Avro是行存储格式,哪怕你仅需要单个字段,也必须读取整行所有字段完成反序列化后再丢弃冗余列,这种场景下两者内存占用差距可达数倍到数十倍。

还有两个常见的特殊情况可以参考:

如果你开启了ORC向量化读取配置spark.sql.orc.enableVectorizedReader=true,ORC的内存占用会进一步降低,向量化 reader 会批量处理多行数据,大幅减少零散对象的内存开销。
如果你读取后调用cache()/persist()做内存缓存,使用默认反序列化存储级别时两者缓存占用基本一致;如果使用序列化存储级别,缓存的是Spark内部对象序列化后的结果,和原始存储格式无关,全量字段场景下也不会有明显差异。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:54:04