Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 使用spark window函数获取最后一个值_Apache Spark_Apache Spark Sql - Fatal编程技术网

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)做什么?设置窗口函数的范围/框架(应考虑哪些行)。