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

SparkSQL 之 Json 格式数据转 DataSet 代码实现

摘要:JSON 是数据工程中最常见的半结构化格式,如何高效地将 JSON 转为类型安全的 Dataset[CaseClass]?本文从 spark.read.json() 的三种数据源、Schema 推断 vs 手动指定的优劣对比、嵌套 JSON 的三种展平模式(Dot Notation / explode / from_json)、以及 Encoder[CaseClass] 映射四个维度,配合 2 张架构图 + 完整代码实例,覆盖 Json Options 全部配置项,给出生产级的 JSON→Dataset 转换实践。

关键词:spark.read.json, Schema 推断, explode, from_json, Encoder, CaseClass, Nested JSON, Json Options


一、开篇:JSON→Dataset 的正确姿势

JSON → Dataset 三大核心问题 ① Schema: 自动推断 vs 手动指定 → 性能&精确度权衡 ② Nested: Struct/Array/Map 嵌套字段如何展平 ③ Encoding: Row → CaseClass 的类型安全映射

二、JSON → DataFrame/Dataset 转换流程

2.1 三种数据源入口

// ① 文件系统(最常用)valdf=spark.read.json("hdfs://data/events/2024/*.json")valdf=spark.read.json("/local/path/file.json")// ② RDD[String] → DataFramevaljsonStrings:Dataset[String]=spark.createDataset(Seq("""{"id":1,"name":"张三"}""","""{"id":2,"name":"李四"}"""))valdf=spark.read.json(jsonStrings)// ③ DataFrame 直接构建valschema=StructType(Seq(StructField("id",LongType),StructField("name",StringType)))valdf=spark.createDataFrame(rows,schema)

2.2 Schema 推断 vs 手动指定

// 方式 A: 自动推断(方便但慢)valdf=spark.read.option("inferSchema","true").option("samplingRatio","0.1").json("path")// 方式 B: 手动 Schema(推荐)valschema=StructType(Seq(StructField("id",LongType),StructField("name",StringType),StructField("age",IntegerType)))valdf=spark.read.schema(schema).json("path")// ✅ 零推断开销 · 类型精确 · 不依赖采样

三、嵌套 JSON 展平三大模式

3.1 Dot Notation — Struct 字段访问

valflat=df.select($"id",$"name",$"address.city".as("city"),$"address.street".as("street"))// 或用 selectExpr SQL 风格valflat=df.selectExpr("id","name","address.city as city","address.street as street")

3.2 explode — Array 数组展平(1行→N行)

valexploded=df.select($"id",$"name",explode($"orders").as("order")).select($"id",$"name",$"order.oid",$"order.price")// explode_outer: 保留空数组行// posexplode: 额外输出数组下标

3.3 from_json — 动态解析 JSON 字符串

importorg.apache.spark.sql.functions.from_jsonvalorderSchema=StructType(Seq(StructField("oid",LongType),StructField("price",DoubleType)))df.select($"id",from_json($"jsonStrCol",orderSchema).as("parsed")).select($"id",$"parsed.oid",$"parsed.price")

四、Dataset[CaseClass] 类型安全映射

caseclassUser(id:Long,name:String,age:Int)caseclassFlatOrder(id:Long,name:String,oid:Long,price:Double)valds:Dataset[FlatOrder]=df.select($"id",$"name",explode($"orders").as("order")).select($"id",$"name",$"order.oid",$"order.price").as[FlatOrder]// Encoder 自动推导// 类型安全操作ds.filter(_.price>100).map(o=>o.copy(price=o.price*1.1))

五、Json Options 速查

类别参数说明
损坏处理mode=PERMISSIVE/DROPMALFORMED/FAILFAST损坏行处理策略
格式multiLine / allowComments / allowSingleQuotes非标准 JSON 兼容
类型primitivesAsString / preferDecimal推断控制
日期dateFormat / timestampFormat日期解析
性能inferSchema / samplingRatio推断开销控制

六、总结

  1. Schema 策略:手动 Schema 比自动推断更快更精确,生产环境推荐.schema(structType)

  2. 嵌套展平三模式:Dot Notation(Struct) → explode(Array) → from_json(String JSON)。

  3. Dataset[CaseClass]:通过.as[T]获得编译时类型安全,Encoder 比 Kryo 快 10x。


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

http://www.jsqmd.com/news/1397971/

相关文章:

  • 2026低空防御企业推荐:从责任闭环能力看华诺星空低空防御体系的强大之处 - 行业深度观察
  • Photoshop AI插件StartAI:从安装到高阶应用的全方位指南
  • 性能提升量化与精度权衡:从置信区间到统计显著的工程实践
  • 网络安全就业方向与职业发展全解析
  • 2026合同诈骗事务所专业评测 涉合同欺诈案件代理机构实力对比 - 好物分享知识传播
  • 热键冲突快速排查指南:一步到位揪出偷走快捷键的元凶
  • Umi-OCR上手指南:3分钟用免费离线OCR软件搞定文字提取
  • 昆明卖黄金避坑手册:别被虚高报价迷惑,正规黄金回收门店的几个核心判断标准 - 日常前沿快讯
  • MIME类型解析:Web开发中的内容协商与文件处理
  • 深圳卖包避坑指南,读懂双重核验机制远离名包回收压价乱象 - 日常前沿快讯
  • 你的德尔沃Brilliant和莫奈Rejane还能回收多少钱?2025-2026包包回收行情全解析 - 好物循环记
  • YUV到RTP转换:实时视频传输的核心技术解析
  • 从零搭建个人网站:HTML/CSS/JS实战指南与响应式设计
  • Unity 6实战:从零构建3D动作RPG战斗系统(玩家控制、敌人AI、连招)
  • 画质差先别怪显卡:用 DLSS Swapper 给旧游戏换上最新版 DLSS
  • 2026年北京担保合同纠纷律所参考:从业务领域到团队配置公开比对 - 好物分享知识传播
  • WechatSogou 公众号数据采集实战:30 分钟搭建你的公众号情报监控工具
  • 超频参数全凭 BIOS 说了算?用 ZenTimings 快速验证 Ryzen 内存时序真实状态的实战手册
  • OpenClaw安全加固实战:从漏洞分析到防护方案
  • GitHub新手入门指南:从代码托管到开发者协作的完整实践
  • RDMA 从入门到落地(二)
  • 2026淮南性价比高的毛坯房装修精选推荐 - 谁都没有我好看
  • JVM 性能调优与故障排查全景图:从工具选型到云闪付千万级生产实战
  • Git-knife:可视化批量编辑Git提交历史,告别rebase繁琐操作
  • 5 分钟跑通全平台弹幕抓取:BarrageGrab 实战上手全记录
  • C#语言版本冲突解决方案:从编译错误到项目配置优化
  • 2026靠谱青甘领队怎么挑选?避坑甄选技巧|青甘大环线7日旅游攻略 - 纯玩旅游攻略指南
  • 7步把爱车变成智能驾驶:openpilot从装车到个性化调优的完整实操指南
  • 企业业务剥离阶段,SAP系统完整拆分实操方案全解析
  • 超级电容极耳一焊就穿?精密激光焊接的双脉冲密码