【发布时间】:2017-03-30 09:57:10
【问题描述】:
我使用 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|
+---+----+
因为,我通过 orderBy 对 'k' 和 'v' 的操作显示了 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()
我发现每次在上面运行后它的结果可能都不一样。有人遇到和我一样的经历吗?我希望在我的项目中使用这两个功能,但我发现这些解决方案都没有定论。
【问题讨论】:
-
看来你需要f.max
-
我只是用那些代码来模拟我遇到的情况。在我的项目中,我实际上需要 first 和 last 之类的功能。也许,有一些替代方案。
标签: apache-spark pyspark