Spark 可以直接将数据读取到嵌套的 case class 中吗?

Can Spark read data directly into a nested case class?

假设您有一个包含三列的 CSV:itemusernameuserid。使用 Spark 的数据集 API 读取此内容是一件相当简单的事情:

case class Flat(item: String, username: String, userid: String)
ds = sparkSession.read.csv("path/to/data").toDF("item", "username", "userid").as[Flat]

那么 ds 的类型就是 Dataset[Flat].

但是假设您希望数据具有 Dataset[Nested] 的形式,其中 Nested 由以下公式给出:

case class User(name: String, id: String)
case class Nested(item: String, user: User)

一种方法是将数据读入 Dataset[Flat],然后应用 map 将其转换为 Dataset[Nested],但实际上 Flat case class 通常不需要其他任何东西,它使代码不必要地冗长。有没有办法跳过中间人,直接构造一个Dataset[Nested]?

Is there any way to skip the middleman and directly construct a Dataset[Nested]?

没有 - Datasets 结构和名称匹配。你不能只有名字,数据必须重塑。

如果您希望跳过 Flat 定义,只需使用动态 API

import org.apache.spark.sql.functions._

ds.select($"item", struct($"name", $"id") as "user").as[Nested]

as[Flat] 没有真正的类型检查,所以你不会丢失任何东西。