在 DataFrame 上强制执行接口
Enforcing an interface on a DataFrame
我是 Spark 的新手,想知道以下是否可行。
我有 2 个 Datasets
,它们都有字段 EventTime
和 UserId
。但是,它们在所有其他列中都不同。
我想编写一个函数,接收这些 Datasets
并吐出我最后一次见到每个用户的时间。
这很简单,因为我们可以 select 每个用户的最长时间行 (groupby
)
假设我有一个函数LastSeenTime(events: DataFrame): DataFrame { ... }
我的问题是你将如何组织代码,并可能定义一个 type/interface 这样 LastSeenTime
可以强制 events
具有 UserId
和 EventTime
需要进行处理的列。
Dataset Schema 是否符合部分接口?
谢谢!
你可以做这样的事情:
sealed trait Event {
def userId: String
def eventTime: String
}
final case class UserEvent(userId: String, eventTime: String, otherField: String) extends Event
def lastTimeByUser[E <: Event, T](events: Dataset[E]): Dataset[T] = ???
编辑
如果您使用 Dataframe
,您可以 "cast" 使用 .as[T]
Dataset[T]
方法。 (其中 T
是 案例 class 您想要用于表示您的数据 - 必须具有与您的 Rows
).
请注意,您需要在范围内使用 implicit Encoder[T]
- 提供它的最简单方法是 import spark.implicits._
,其中 spark
是一个实例SparkSession
.
我是 Spark 的新手,想知道以下是否可行。
我有 2 个 Datasets
,它们都有字段 EventTime
和 UserId
。但是,它们在所有其他列中都不同。
我想编写一个函数,接收这些 Datasets
并吐出我最后一次见到每个用户的时间。
这很简单,因为我们可以 select 每个用户的最长时间行 (groupby
)
假设我有一个函数LastSeenTime(events: DataFrame): DataFrame { ... }
我的问题是你将如何组织代码,并可能定义一个 type/interface 这样 LastSeenTime
可以强制 events
具有 UserId
和 EventTime
需要进行处理的列。
Dataset Schema 是否符合部分接口?
谢谢!
你可以做这样的事情:
sealed trait Event {
def userId: String
def eventTime: String
}
final case class UserEvent(userId: String, eventTime: String, otherField: String) extends Event
def lastTimeByUser[E <: Event, T](events: Dataset[E]): Dataset[T] = ???
编辑
如果您使用 Dataframe
,您可以 "cast" 使用 .as[T]
Dataset[T]
方法。 (其中 T
是 案例 class 您想要用于表示您的数据 - 必须具有与您的 Rows
).
请注意,您需要在范围内使用 implicit Encoder[T]
- 提供它的最简单方法是 import spark.implicits._
,其中 spark
是一个实例SparkSession
.