Apache spark 使用spark window函数获取最后一个值
假设我有一个这样的数据帧Apache spark 使用spark window函数获取最后一个值,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,假设我有一个这样的数据帧 val df=sc.parallelize(Seq( (1.0,1,“马特”), (1.0,2,“约翰”), (1.0,3,null.asInstanceOf[String]), (-1.0,2,“亚当”), (-1.0,4,“史蒂夫”)) ).toDF(“id”、“时间戳”、“名称”) 我想为每个按时间戳排序的id获取最后一个非空值。这是我的窗户 val partitionWindow=Window.partitionBy($“id”).orderBy($“time
val df=sc.parallelize(Seq(
(1.0,1,“马特”),
(1.0,2,“约翰”),
(1.0,3,null.asInstanceOf[String]),
(-1.0,2,“亚当”),
(-1.0,4,“史蒂夫”))
).toDF(“id”、“时间戳”、“名称”)
我想为每个按时间戳排序的id获取最后一个非空值。这是我的窗户
val partitionWindow=Window.partitionBy($“id”).orderBy($“timestamp.desc)
我正在创建一个独特的窗口数据
val filteredDF=df.filter($“name”.isNotNull)。在(分区窗口)上方有列(“firstName”,first(“name”)。drop(“timestamp”,“name”).distinct
并将其连接回实际数据
val joinedDF=df.join(filteredDF,windowDF.col(“id”)==filteredDF.col(“id”).drop(filteredDF.col(“id”))
joinedDF.show()
它很好用,但我不喜欢这个解决方案,有人能给我推荐更好的吗
还有,谁能告诉我为什么最后一个函数不起作用?我试过了,结果不正确
val partitionWindow=Window.partitionBy($“id”).orderBy($“timestamp”)
val windowDF=df.withColumn(“lastName”,last(“name”)over(partitionWindow))
如果要传播最后一个已知值(它与join
使用的逻辑不同),您应该:
按时间戳排序
- 取
忽略last
:null
val partitionWindow=Window.partitionBy($“id”).orderBy($“timestamp”)
df.withColumn(“lastName”,last(“name”,true)over(partitionWindow)).show
// +----+---------+-----+--------+
//| id |时间戳|姓名|姓氏|
// +----+---------+-----+--------+
//|-1.0 | 2 |亚当|亚当|
//|-1.0 | 4 |史蒂夫|史蒂夫|
//| 1.0 | 1 |马特|马特|
//| 1.0 | 2 |约翰|约翰|
//| 1.0 | 3 |空|约翰|
// +----+---------+-----+--------+
如果要全局获取最后一个值:
按时间戳排序
- 设置无界帧
- 取
忽略last
:null
val partitionWindow=Window.partitionBy($“id”).orderBy($“timestamp”)
.rowsBetween(Window.unboundedPreceding,Window.unboundedFollowing)
df.withColumn(“lastName”,last(“name”,true)over(partitionWindow)).show
// +----+---------+-----+--------+
//| id |时间戳|姓名|姓氏|
// +----+---------+-----+--------+
//|-1.0 | 2 |亚当|史蒂夫|
//|-1.0 | 4 |史蒂夫|史蒂夫|
//| 1.0 | 1 |马特|约翰|
//| 1.0 | 2 |约翰|约翰|
//| 1.0 | 3 |空|约翰|
// +----+---------+-----+--------+
谢谢,.rowsBetween(Window.unboundedPreceding,Window.unboundedFollowing)做什么?设置窗口函数的范围/框架(应考虑哪些行)。