在 DataFrame 上强制执行接口

Enforcing an interface on a DataFrame

我是 Spark 的新手,想知道以下是否可行。

我有 2 个 Datasets,它们都有字段 EventTimeUserId。但是,它们在所有其他列中都不同。

我想编写一个函数,接收这些 Datasets 并吐出我最后一次见到每个用户的时间。

这很简单,因为我们可以 select 每个用户的最长时间行 (groupby)

假设我有一个函数LastSeenTime(events: DataFrame): DataFrame { ... }

我的问题是你将如何组织代码,并可能定义一个 type/interface 这样 LastSeenTime 可以强制 events 具有 UserIdEventTime 需要进行处理的列。

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.