gpt4 book ai didi

apache-spark - 如何在pyspark中使用第一个和最后一个函数?

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

我使用 first 和 last 函数来获取一列的第一个和最后一个值。但是,我发现这两个功能都不像我想象的那样工作。我提到了answer @zero323 ,但我仍然对两者感到困惑。代码如下:

df = spark.sparkContext.parallelize([
("a", None), ("a", 1), ("a", -1), ("b", 3), ("b", 1)
]).toDF(["k", "v"])
w = Window().partitionBy("k").orderBy('k','v')

df.select(F.col("k"), F.last("v",True).over(w).alias('v')).show()

结果:
+---+----+
| k| v|
+---+----+
| b| 1|
| b| 3|
| a|null|
| a| -1|
| a| 1|
+---+----+

我想它应该是这样的:
+---+----+
| k| v|
+---+----+
| b| 3|
| b| 3|
| a| 1|
| a| 1|
| a| 1|
+---+----+

因为,我通过对 'k' 和 'v' 的 orderBy 操作显示了 df:
df.orderBy('k','v').show()
+---+----+
| k| v|
+---+----+
| a|null|
| a| -1|
| a| 1|
| b| 1|
| b| 3|
+---+----+

另外,我想出了另一个解决方案来测试这类问题,我的代码如下:
df.orderBy('k','v').groupBy('k').agg(F.first('v')).show()

我发现每次在它上面运行后,它的结果可能会有所不同。有人遇到和我一样的经历吗?我希望在我的项目中使用这两个功能,但我发现这些解决方案尚无定论。

最佳答案

尝试使用 .desc() 反转排序顺序然后 first()将给出所需的输出。

w2 = Window().partitionBy("k").orderBy(df.v.desc())
df.select(F.col("k"), F.first("v",True).over(w2).alias('v')).show()
F.first("v",True).over(w2).alias('v').show()

输出:
+---+---+
| k| v|
+---+---+
| b| 3|
| b| 3|
| a| 1|
| a| 1|
| a| 1|
+---+---+

您还应该注意 partitionBy 与 orderBy。由于您按“k”进行分区,因此任何给定窗口中的所有 k 值都相同。按 'k' 排序没有任何作用。

就返回窗口中的哪一项而言,last 函数与 first 并不是真正的对立面。它返回它看到的最后一个非空值,因为它在有序行中前进。

为了比较它们的效果,这里有一个包含函数/排序组合的数据框。注意在列 'last_w2' 中,空值是如何被 -1 替换的。
df = spark.sparkContext.parallelize([
("a", None), ("a", 1), ("a", -1), ("b", 3), ("b", 1)]).toDF(["k", "v"])

#create two windows for comparison.
w = Window().partitionBy("k").orderBy('v')
w2 = Window().partitionBy("k").orderBy(df.v.desc())

df.select('k','v',
F.first("v",True).over(w).alias('first_w1'),
F.last("v",True).over(w).alias('last_w1'),
F.first("v",True).over(w2).alias('first_w2'),
F.last("v",True).over(w2).alias('last_w2')
).show()

输出:
+---+----+--------+-------+--------+-------+
| k| v|first_w1|last_w1|first_w2|last_w2|
+---+----+--------+-------+--------+-------+
| b| 1| 1| 1| 3| 1|
| b| 3| 1| 3| 3| 3|
| a|null| null| null| 1| -1|
| a| -1| -1| -1| 1| -1|
| a| 1| -1| 1| 1| 1|
+---+----+--------+-------+--------+-------+

关于apache-spark - 如何在pyspark中使用第一个和最后一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43114445/

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