gpt4 book ai didi

scala - 如何将当前行的值与下一个相除?

转载 作者:行者123 更新时间:2023-12-01 13:34:43 25 4
gpt4 key购买 nike

在 Spark-Sql 版本 1.6 中,使用 DataFrames,有没有办法为特定列计算每一行的当前行和下一行的分数?

例如,如果我有一个只有一列的表,就像这样

Age
100
50
20
4

我想要以下输出

Franction
2
2.5
5

最后一行被删除,因为它没有要添加的“下一行”。

现在我通过对表进行排名并将其与自身连接来实现,其中 rank 等于 rank+1

有更好的方法吗?这可以用 Window 函数来完成吗?

最佳答案

Window 函数应该只做部分技巧。其他部分技巧可以通过定义一个 udf 函数

来完成
def div = udf((age: Double, lag: Double) => lag/age)

首先,我们需要使用 Window 函数找到 lag,然后将 lagage 传递给 udf 函数来查找 div 导入 sqlContext.implicits._ 导入 org.apache.spark.sql.functions._

val dataframe = Seq(
("A",100),
("A",50),
("A",20),
("A",4)
).toDF("person", "Age")

val windowSpec = Window.partitionBy("person").orderBy(col("Age").desc)
val newDF = dataframe.withColumn("lag", lag(dataframe("Age"), 1) over(windowSpec))

最后调用udf函数

newDF.filter(newDF("lag").isNotNull).withColumn("div", div(newDF("Age"), newDF("lag"))).drop("Age", "lag").show

最终输出为

+------+---+
|person|div|
+------+---+
| A|2.0|
| A|2.5|
| A|5.0|
+------+---+

已编辑正如@Jacek 建议的更好的解决方案,使用 .na.drop 而不是 .filter(newDF("lag").isNotNull) 并使用 / 运算符,所以我们甚至不需要调用 udf 函数

newDF.na.drop.withColumn("div", newDF("lag")/newDF("Age")).drop("Age", "lag").show

关于scala - 如何将当前行的值与下一个相除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44392754/

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