我是 Spark 的新手,我对聚合函数MAX
和MIN
SparkSQL有一些疑问
在 SparkSQL 中,当我使用MAX
/MIN
函数时,只返回MAX(value)
/ MIN(value)
。但是如果我还想要其他相应的列呢?
例如,给定一个带有列的数据框time
,value
并且label
,我怎样才能得到time
分组MIN(Value)
依据label
?
谢谢。
我是 Spark 的新手,我对聚合函数MAX
和MIN
SparkSQL有一些疑问
在 SparkSQL 中,当我使用MAX
/MIN
函数时,只返回MAX(value)
/ MIN(value)
。但是如果我还想要其他相应的列呢?
例如,给定一个带有列的数据框time
,value
并且label
,我怎样才能得到time
分组MIN(Value)
依据label
?
谢谢。
你需要先做一个groupBy
,然后再join
回到原来的那个DataFrame
。在 Scala 中,它看起来像这样:
df.join(
df.groupBy($"label").agg(min($"value") as "min_value").withColumnRenamed("label", "min_label"),
$"min_label" === $"label" && $"min_value" === $"value"
).drop("min_label").drop("min_value").show
我不使用 Python,但它看起来与上面的很接近。
您甚至可以max()
一次性min()
完成:
df.join(
df.groupBy($"label")
.agg(min($"value") as "min_value", max($"value") as "max_value")
.withColumnRenamed("label", "r_label"),
$"r_label" === $"label" && ($"min_value" === $"value" || $"max_value" === $"value")
).drop("r_label")
您可以使用 sortByKey(true) 按升序排序,然后应用操作“take(1)”来获取 Max。
并使用 sortByKey(false) 按降序排序,然后应用动作“take(1)”得到 Min
如果你想使用 spark-sql 的方式,你可以按照@maxymoo 解释的方法