【发布时间】:2019-09-11 21:04:43
【问题描述】:
我尝试使用窗口函数创建一个函数,该函数可以通过“会话”列丰富给定的DataFrame。所以我需要使用partitionBy和orderBy。
val by_uuid_per_date = Window.partitionBy("uuid").orderBy("year","month","day")
// A Session = A day of events for a certain user. uuid x (year+month+day)
val enriched_df = df
.withColumn("session", dense_rank().over(by_uuid_per_date))
.orderBy("uuid","timestamp")
.select("uuid","year","month","day","session")
这很好用,但是当我尝试制作一个封装这种行为的函数时:
PS:我使用了_* splat 运算符。
def enrich_with_session(df:DataFrame,
window_partition_cols:Array[String],
window_order_by_cols:Array[String],
presentation_order_by_cols:Array[String]):DataFrame={
val by_uuid_per_date = Window.partitionBy(window_partition_cols: _*).orderBy(window_order_by_cols: _*)
df.withColumn("session", dense_rank().over(by_uuid_per_date))
.orderBy(presentation_order_by_cols:_*)
.select("uuid","year","month","mday","session")
}
我收到以下错误:
notebook:6: error: no `: _*' annotation here allowed (这样的注释只允许在 -parameters 的参数中) val by_uuid_per_date = Window.partitionBy(window_partition_cols: _).orderBy(window_order_by_cols: _*)
【问题讨论】:
-
可能
partitionBy不期望可变参数。但是对于一个、两个等参数的变体很简单。尝试检查文档或源代码。
标签: scala apache-spark apache-spark-sql