获取窗口的第一个和最后一个条目

时间:2017-10-10 16:16:22

标签: scala apache-spark

我想创建一个仅包含窗口的第一个和最后一个值的数据集。 以我为例:
第一个条目是最早的时间戳
第二个条目是最新的时间戳
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)

有人比我有更快/更不同的方法吗? 任何帮助将不胜感激。

0 个答案:

没有答案