Spark能否直接将数据读入嵌套的案例类?

时间:2017-12-18 01:46:54

标签: scala apache-spark apache-spark-dataset

假设您有一个包含三列的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其他任何东西都不需要上课,这使得代码不必要地冗长。有没有办法跳过中间人并直接构建Dataset[Nested]

1 个答案:

答案 0 :(得分:4)

  

有没有办法跳过中间人并直接构建数据集[嵌套]?

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

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

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

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

as[Flat]并非真正打字检查,因此您不会丢失任何内容。