数据与 JSON
Spark、Doobie、Slick、Circe。
35 分钟
数据与 JSON
Scala 数据栈覆盖 Spark(分布式计算)、Doobie / Slick(JDBC FP 封装)、Circe(JSON)。对照 /roadmaps/scala「Data & JSON」节点。
学习目标
- 用 Circe 序列化 / 反序列化 case class
- 了解 Doobie 与 Slick 访问关系型数据库的方式
- 知道 Spark 在 Scala 生态中的位置
核心概念
Circe JSON
import io.circe.*
import io.circe.generic.auto.*
import io.circe.parser.*
import io.circe.syntax.*
case class Bookmark(id: Long, url: String, title: String)
val bm = Bookmark(1L, "https://example.com", "Example")
val json: Json = bm.asJson
println(json.noSpaces)
val raw = """{"id":2,"url":"https://b.com","title":"B"}"""
val decoded: Either[Error, Bookmark] = decode[Bookmark](raw)
decoded match
case Right(b) => println(s"ok: ${b.title}")
case Left(e) => println(s"fail: ${e.getMessage}")
generic.auto 自动推导 encoder/decoder;生产环境常用 semi-auto 显式导入以降低编译时间。
Doobie 查询(FP JDBC)
import doobie.*
import doobie.implicits.*
case class Row(id: Long, title: String)
def findById(xa: Transactor[IO], id: Long): IO[Option[Row]] =
sql"SELECT id, title FROM bookmarks WHERE id = $id"
.query[Row]
.option
.transact(xa)
Doobie 用 IO 描述数据库效应,sql"..." interpolator 防 SQL 注入;与 Spring JdbcTemplate 命令式风格对比鲜明。
Slick 与 Spark 概览
| 库 | 用途 |
|---|---|
| Slick | FRM,类型安全查询 DSL,生成 SQL |
| Doobie | 轻量 JDBC 层,Cats Effect 友好 |
| Circe | JSON 编解码 |
| Spark | 大规模批/流处理,Scala 为首选 API 语言 |
// Spark 概念片段(集群上运行)
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("demo").master("local[*]").getOrCreate()
import spark.implicits.*
val counts = spark.read.json("events.json")
.groupBy($"userId")
.count()
counts.show()
Spark 作业通常独立部署,与 Spring Boot CRUD 服务互补。
与 Java 对照
| Scala | Java |
|---|---|
| Circe | Jackson / Gson |