news 2026/8/22 12:20:35

SparkSQL 之 DataSet 存储代码实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SparkSQL 之 DataSet 存储代码实现

SparkSQL 之 DataSet 存储代码实现

摘要:DataFrameWriter 提供了统一的写出 API。本文从 6 步流水线、SaveMode 四模式、partitionBy/bucketBy、四大格式对比、saveAsTable/insertInto、文件数控制六个维度,配合 2 张架构图 + 代码实例,全面掌握 Dataset 存储的最佳实践。

关键词:DataFrameWriter, SaveMode, partitionBy, bucketBy, saveAsTable, Parquet, ORC, coalesce


一、开篇

df.write.format("parquet").mode("overwrite").partitionBy("dt").save("path")// 便捷 API: df.write.parquet("path") / df.write.json("path") / df.write.csv("path")

二、写出流水线 & SaveMode

SaveMode

模式行为
Append追加
Overwrite覆盖删除旧数据
ErrorIfExists目录存在则报错(默认)
Ignore目录存在则跳过

分区与分桶

// 分区: /path/dt=2024-01-01/hour=12/df.write.partitionBy("dt","hour").parquet("path")// 分桶: 10 个桶文件,每个桶内按 ts 排序df.write.bucketBy(10,"user_id").sortBy("ts").saveAsTable("tbl")

三、存储格式 & Hive 表写出

格式选型

格式特点
Parquet默认·列式·Spark原生
ORCHive原生·压缩略优
JSON可读·体积 3-5x
CSV通用·体积 5-10x

saveAsTable vs insertInto

// saveAsTable: 自动建表df.write.mode("overwrite").saveAsTable("db.tbl")// insertInto: 表必须已存在,按列位置匹配!df.write.mode("append").insertInto("db.tbl")

四、文件数控制

df.coalesce(4).write.parquet("path")// 无 shuffle → 4 文件df.repartition(4).write.parquet("path")// shuffle → 4 文件

五、总结

  • 写出流程:write→format→mode→partitionBy→option→save
  • 格式:默认 Parquet,Hive 用 ORC,交换用 JSON/CSV
  • 技巧:coalesce 减少小文件·bucketBy 加速 JOIN·insertInto 注意列位置

作者:starzy
博客:blog.starzy.cn
GitHub:starzy1990.github.io
专注 AI Agent · LangGraph · RAG · 大数据架构 · 数据工程实践

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 12:20:06

保姆级100天Python学习计划:用《Python-100-Days》从零基础练到实战

保姆级100天Python学习计划:用《Python-100-Days》从零基础练到实战 【免费下载链接】Python-100-Days Python - 100天从新手到大师 项目地址: https://gitcode.com/GitHub_Trending/py/Python-100-Days 想学Python,收藏夹里躺了三十个G的视频&am…

作者头像 李华
网站建设 2026/8/22 12:19:34

在PHP中如何进行网络编程?

网络编程是一个让计算机之间能够互相通信的方法。在PHP中,我们可以使用“套接字”(Sockets)来进行网络编程。套接字就像是我们用来打电话的电话线,它允许不同的计算机之间发送和接收信息。下面是一个简单的PHP代码示例&#xff0c…

作者头像 李华
网站建设 2026/8/22 12:17:00

什么是字节码?采用字节码的好处是什么?

在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),字节码是一种中间代码,它是由源代码经过编译生成的一种二进制表示形式。字节码通常不针对特定的硬件平台,而是针对虚拟机设计的&…

作者头像 李华
网站建设 2026/8/22 12:14:50

centos虚拟机里面为何执行ethtool不显示速率?

最近蛮多类似询问,虚拟机里面执行ethtool为何不显示速率,但是windows却能显示速率为10Gbps。上图上图:与物理主机不同,在kvm虚拟化环境中,ethtool仅返回了网口状态。来看看红帽的说明:IssueHow do I check …

作者头像 李华
网站建设 2026/8/22 12:14:46

3分钟把开源宏录制工具PyMacroRecord调成中文界面:完整指南

3分钟把开源宏录制工具PyMacroRecord调成中文界面:完整指南 【免费下载链接】PyMacroRecord Free and Open Source Macro Recorder with a modern GUI using Python 项目地址: https://gitcode.com/gh_mirrors/py/PyMacroRecord PyMacroRecord 是一款免费的开…

作者头像 李华