【问题标题】:Can Spark read data directly into a nested case class?Spark 可以将数据直接读取到嵌套的案例类中吗?
【发布时间】:2018-05-31 08:44:18
【问题描述】:

假设您有一个包含三列的 CSV:itemusernameuserid。使用 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]

那么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]

【问题讨论】:

  • 您是否尝试使用 sparkContext 而不是 sqlContext 读取它,然后使用您提到的映射将其转换为嵌套案例类?
  • 火花糟糕的众多原因之一 - 它不能这样做

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


【解决方案1】:

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

没有 - Datasets 按结构和名称匹配。您不能只拥有名称,并且必须重新塑造数据。

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

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

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

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

【讨论】:

  • @user8371915 - 在这种情况下,如何在将它们映射为嵌套案例类后访问用户 ID?
  • @user1384205 .map(_.id).?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
相关资源
最近更新 更多