假设您有一个包含三列的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
其他任何东西都不需要上课,这使得代码不必要地冗长。有没有办法跳过中间人并直接构建Dataset[Nested]
?
答案 0 :(得分:4)
有没有办法跳过中间人并直接构建数据集[嵌套]?
没有 - Datasets
按结构和名称匹配。你不能只有名字和数据必须重新塑造。
如果您希望跳过Flat
定义,请使用动态API
import org.apache.spark.sql.functions._
ds.select($"item", struct($"name", $"id") as "user").as[Nested]
as[Flat]
并非真正打字检查,因此您不会丢失任何内容。