在DataFrame上实施接口

时间:2018-11-14 23:18:54

标签: scala apache-spark-dataset

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

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

我想编写一个函数,接受这些Datasets并在上次见到每个用户时吐出。

这很容易,因为我们可以为每个用户选择时间最长的行(groupby

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

我的问题是,您将如何组织代码,并可能定义类型/接口,以使LastSeenTime可以强制events拥有UserIdEventTime列需要进行处理。

数据集架构可以符合部分接口吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以进行以下操作:

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,则可以使用Dataset[T] 方法将其“投射” .as[T]T是要用于表示数据的 case类,必须与Rows的字段相同)
/> 请注意,您需要在此范围内使用隐式 Encoder[T]-提供该名称的最简单方法是import spark.implicits._,其中spark是{{ 1}}。