编写一个 window 函数 Spark

Write a window function Spark

我有一个 table:

+-------------------+-------------+--------------+-------+-------------+
|         session_id|  insert_dttm|           key|  value| process_name|
+-------------------+-------------+--------------+-------+-------------+
|local-1641922005078|1641922023703|test_file1.csv|Success|ProcessResult|
|local-1641922005078|1641922023704|test_file1.csv|Success|ProcessResult|
|local-1641922005078|1641922023705|test_file2.csv|Success|ProcessResult|
|local-1641922005080|1641922023706|test_file2.csv|Success|ProcessResult|
|local-1641922005080|1641922023707|test_file3.csv|Success|ProcessResult|
|local-1641922005080|1641922023708|test_file3.csv|Success|ProcessResult|
+-------------------+-------------+--------------+-------+-------------+

我想从这个 table:

中获取最后一个会话
local-1641922005080 :String

我可以使用 window 函数来实现吗?

我有解决办法:

val lastSessionId = ds.select(max(struct(col("insert_dttm"), col("session_id")))("session_id"))
                      .first.getString(0)

只是我也想用window函数实现这个

实际上您不需要 window 函数,因为您可以按 desc 顺序对数据进行排序,return 使用 limit(1) 对第一条记录进行排序。

但为了练习,您可以像这样使用 window 函数:

import org.apache.spark.sql.functions.{col, row_number}
import org.apache.spark.sql.expressions.Window


val windowSpec  = Window.orderBy(col("insert_dttm").desc)
val lastSessionId = df.withColumn("row_number", row_number.over(windowSpec)).filter("row_number=1").first.getString(0)