gpt4 book ai didi

scala - Spark 2.1.1 中获取窗口的最后一个元素

转载 作者:行者123 更新时间:2023-12-02 12:07:12 26 4
gpt4 key购买 nike

我有一个数据框,其中有子类别,并且想要每个子类别的最后一个元素。

val windowSpec = Window.partitionBy("name").orderBy("count")
sqlContext
.createDataFrame(
Seq[(String, Int)](
("A", 1),
("A", 2),
("A", 3),
("B", 10),
("B", 20),
("B", 30)
))
.toDF("name", "count")
.withColumn("firstCountOfName", first("count").over(windowSpec))
.withColumn("lastCountOfName", last("count").over(windowSpec))
.show()

返回给我一些奇怪的东西:

+----+-----+----------------+---------------+                                   
|name|count|firstCountOfName|lastCountOfName|
+----+-----+----------------+---------------+
| B| 10| 10| 10|
| B| 20| 10| 20|
| B| 30| 10| 30|
| A| 1| 1| 1|
| A| 2| 1| 2|
| A| 3| 1| 3|
+----+-----+----------------+---------------+

正如我们所见,返回的 first 值已正确计算,但 last 则不然,它始终是列的当前值。

有人可以解决我想做的事情吗?

最佳答案

根据问题SPARK-20969 ,您应该能够通过为窗口定义足够的边界来获得预期的结果,如下所示。

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._

val windowSpec = Window
.partitionBy("name")
.orderBy("count")
.rowsBetween(Window.unboundedPreceding, Window.unboundedFollowing)

sqlContext
.createDataFrame(
Seq[(String, Int)](
("A", 1),
("A", 2),
("A", 3),
("B", 10),
("B", 20),
("B", 30)
))
.toDF("name", "count")
.withColumn("firstCountOfName", first("count").over(windowSpec))
.withColumn("lastCountOfName", last("count").over(windowSpec))
.show()

或者,如果您在第一个和最后一个计算的同一列上进行排序,则可以使用非排序窗口更改 minmax,然后它也应该可以正常工作。

关于scala - Spark 2.1.1 中获取窗口的最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44950161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com