我是Spark的新手,我想知道以下可能性是否可行。
我有2个Datasets
,并且它们都具有字段EventTime
和UserId
。但是,它们在所有其他列中都不同。
我想编写一个函数,接受这些Datasets
并在上次见到每个用户时吐出。
这很容易,因为我们可以为每个用户选择时间最长的行(groupby
)
假设我有一个函数LastSeenTime(events: DataFrame): DataFrame { ... }
我的问题是,您将如何组织代码,并可能定义类型/接口,以使LastSeenTime
可以强制events
拥有UserId
和EventTime
列需要进行处理。
数据集架构可以符合部分接口吗?
谢谢!
答案 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}}。