我想创建一个仅包含窗口的第一个和最后一个值的数据集。
以我为例:
第一个条目是最早的时间戳
第二个条目是最新的时间戳
window是文件名
窗口看起来像这样:
val FileWindow = Window.partitionBy($"location", $"systemname", $"filename").orderBy($"timestamp)
我有两种不同的方法,但它们看起来都很慢。
1)
val ds2_first = ds_filtered
.withColumn("rn", row_number().over(ascFileWindow))
.withColumn("max_rn", max($"rn").over(ascFileWindow.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)))
.withColumn("lf_flag", when($"rn" === 1 || $"rn" === $"max_rn", 1).otherwise(lit(0)))
.where($"lf_flag" === 1)
2)
val ascFileWindow = Window.partitionBy($"systemname", $"filename").orderBy($"timestamp".asc)
val descFileWindow = Window.partitionBy($"systemname", $"filename").orderBy($"timestamp".desc)
val ds2_first = ds_filtered
.withColumn("rn", row_number().over(ascFileWindow))
.where($"rn" === 1)
val ds2_last = ds_filtered
.withColumn("rn",row_number().over(descFileWindow))
.where($"rn" === 1)
val ds2 = ds2_first.union(ds2_last)
有人比我有更快/更不同的方法吗? 任何帮助将不胜感激。