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

Pau*_*gel 5 scala apache-spark apache-spark-dataset

假设你有一个CSV有三列:itemusername,和userid。使用Spark的Dataset API读取以下内容非常简单:

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

然后ds将为类型Dataset[Flat]

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

case class User(name: String, id: String)
case class Nested(item: String, user: User)
Run Code Online (Sandbox Code Playgroud)

一种实现方法是将数据读入a Dataset[Flat],然后应用a map将其转换为a Dataset[Nested],但实际上,Flatcase类别通常不需要其他任何东西,并且它会使代码不必要地冗长。有什么方法可以跳过中间人并直接构造一个Dataset[Nested]

hi-*_*zir 7

有什么办法可以跳过中间人,直接构造一个Dataset[Nested]?

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

如果您喜欢跳过Flat定义,请使用动态 API

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

ds.select($"item", struct($"name", $"id") as "user").as[Nested]
Run Code Online (Sandbox Code Playgroud)

as[Flat] 并没有真正键入检查,所以你不会丢失任何东西。