当前位置: 首页 > news >正文

SparkSQL 之 JDBC 数据转 DataSet 代码实现

摘要:JDBC 是连接传统关系型数据库的桥梁。本文从 JDBC 读取三模式(整表/数值分区/自定义Predicate)、并行分区原理、谓词/列裁剪下推、批量写入、连接池管理、以及四大常见坑六个维度,配合 2 张架构图 + 完整代码实例,覆盖 JDBC 操作的全部实践要点。

关键词:spark.read.jdbc, JDBC, partitionColumn, numPartitions, Predicate Pushdown, batchsize


一、开篇

Spark 通过 JDBC 连接所有标准 JDBC 兼容数据库,核心 API 就是spark.read.jdbc()

valprops=newjava.util.Properties()props.setProperty("user","root")props.setProperty("password","123456")props.setProperty("driver","com.mysql.cj.jdbc.Driver")valurl="jdbc:mysql://host:3306/db"valdf=spark.read.jdbc(url,"users",props)

二、JDBC 读取全流程

2.1 三种读取入口

// 方式 1: spark.read.jdbcvaldf=spark.read.jdbc(url,"users",props)// 方式 2: format("jdbc").options()valdf=spark.read.format("jdbc").option(...).load()// 方式 3: 子查询valdf=spark.read.jdbc(url,"(SELECT id,name FROM users WHERE status=1) AS u",props)

2.2 并行分区读取

// 数值列等分区间valdf=spark.read.format("jdbc").option("partitionColumn","id").option("lowerBound","1").option("upperBound","10000000").option("numPartitions","20").load()// → 20 个 Task,每个执行一个 WHERE id BETWEEN ... AND ...// 自定义 Predicate 列表valpredicates=Array("gender = 'M'","gender = 'F'")valdf=spark.read.jdbc(url,"users",predicates,props)

2.3 DataFrame → Dataset[CaseClass]

caseclassUser(id:Long,name:String,age:Int)valds:Dataset[User]=spark.read.jdbc(url,"users",props).as[User]

三、连接管理 & 完整代码模式

3.1 谓词/列裁剪下推

spark.read.jdbc(url,"users",props).filter("age > 30").select("id","name","age")// → SQL: SELECT id, name, age FROM users WHERE age > 30

3.2 批量写回

df.write.mode("append").option("batchsize","5000").option("isolationLevel","READ_UNCOMMITTED").jdbc(url,"target_table",props)

四、四大常见坑

① 连接数爆炸: numPartitions × executors 个连接 → DB max_connections 必须足够 ② 数据倾斜: 分区列值分布不均 → 长尾 Task → 用自定义 Predicate 解决 ③ 全量拉取: 未加 filter → 全表扫描 → 读时用 query 限定范围 ④ batchsize 太小: 默认 1000 → 增量到 5000~10000 显著提速

五、总结

  1. 三种读取模式:整表/subquery + 数值列分区 + 自定义 Predicate。推荐用分区并行读。
  2. 优化要点:谓词/列裁剪下推 + numPartitions ≤ 20 + batchsize=5000~10000。
  3. 避坑:控制连接数、避免分区倾斜、查询加 WHERE 限制。

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

http://www.cnnetsun.cn/news/4099958.html

相关文章:

  • 基于大语言模型的群体推荐系统:AgentGR模拟器原理与实践
  • 奔驰概念雕塑:解码软件定义汽车时代的数字化转型与设计变革
  • Python爬虫实战:招聘网站职位信息采集系统(完整版)
  • 第 6 篇:「用数据说话」— 性能基准测试如何证明架构
  • 开源无人机DIY全攻略:从STM32飞控到Betaflight调参实战
  • DeepSeek Harness 上手指南
  • ESP32-S3驱动LED点阵屏实现数字雨与动态光效全解析
  • YOLO 航拍微小金具涨点|2721 张输电线路防震锤 2 类 VOC/YOLO 数据集,Stokes/Spiral 型识别、无人机线路巡检全流程落地
  • 单片机毕业设计-基于单片机传感器的药品温湿度监测与定时取药系统设计 基于 STM32/51 单片机的重量检测智能药盒语音播报系统设计(024203)
  • 单片机毕业设计-基于 STM32 的红外感应服药确认智能控制系统开发 声光告警 + 短信通知的 STM32 智能定时药盒设计与实现(024303)
  • RT-Thread控制台线程:从串口打印到系统交互的异步架构解析
  • 别再靠微信传文件了:5个问题带你搞懂Windows与iPhone文件传输神器AirDrop Plus
  • 【AI智能体速通】17.AI智能体应用于IT技术支持
  • 免费开源字幕编辑器 Subtitle Edit 使用指南:六个字幕难题,一次治到位
  • 老游戏在新电脑上打不开?DDrawCompat 兼容层零基础修复指南
  • Raspberry Pi Pico嵌入式开发实战:从MicroPython到PIO与双核编程
  • 5G基站PA栅压智能管理:从效率墙挑战到BGMC1210闭环控制方案
  • 从零构建激光游戏系统:光电传感与Arduino实战指南
  • 告别臃肿菜单:Windows右键菜单清理完整指南
  • 用 Redis 之父写的 h3-metal 在 Mac 上跑 MiniMax H3 视频生成
  • 实时屏幕翻译进阶指南:Translumo 免费开源工具从安装到高效使用
  • 如何用 D2DX 让暗黑破坏神2在现代电脑上流畅运行:5 分钟上手的完整指南
  • MHY_Scanner 免费扫码登录工具终极指南:屏幕监视、直播抢码与多账号管理一次讲透
  • 卸载 Edge 总失败?三个翻车现场带你彻底玩转 EdgeRemover
  • QML 双波进度条:错相双层与对向双层
  • E7Helper使用教程:3步从零搞定第七史诗自动挂机,免费开源轻松上手
  • 从贾跃亭到FF:技术理想主义与汽车工业规律的碰撞与启示
  • DeepSeek 大幅涨价:性价比不再?Harness 生态能否破局
  • Ubuntu 24.04 Certbot 自动化SSL证书配置指南
  • Source Sans 3 字体免费商用完整指南:7 个字重 5 种格式,一次配齐不踩坑