Spark 可以直接将数据读取到嵌套的 case class 中吗?
Can Spark read data directly into a nested case class?
假设您有一个包含三列的 CSV:item
、username
和 userid
。使用 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]
没有真正的类型检查,所以你不会丢失任何东西。
假设您有一个包含三列的 CSV:item
、username
和 userid
。使用 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]
没有真正的类型检查,所以你不会丢失任何东西。