闵我新的火花,我对自己在SparkSQLMax和星火
在SparkSQL聚合函数MAX
和MIN
一些问题,当我使用MAX
/MIN
函数只返回MAX(value)
/MIN(value)
。 但是如果我还想要其他相应的列呢?
例如,给定与列time
,value
和label
的数据帧,我怎么能得到time
与MIN(Value)
分组label
?
谢谢。
闵我新的火花,我对自己在SparkSQLMax和星火
在SparkSQL聚合函数MAX
和MIN
一些问题,当我使用MAX
/MIN
函数只返回MAX(value)
/MIN(value)
。 但是如果我还想要其他相应的列呢?
例如,给定与列time
,value
和label
的数据帧,我怎么能得到time
与MIN(Value)
分组label
?
谢谢。
您可以使用sortByKey(true)按升序排序,然后应用“take(1)”操作以获取最大值。
并使用sortByKey(假)由降序排序,然后应用行动“采取(1)”获得闵
如果你想使用火花-SQL的方式,你可以采取的办法由@解释maxymoo
您需要先做一个groupBy
,然后join
回到原来的DataFrame
。在斯卡拉,它看起来像这样:
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")
这不会返回'时间'列,这就是OP想要 –
错误的问题。等一下。 –
编辑我的答案实际上,你知道,回答这个问题。 :) –
你知道如何在常规的SQL这样做呢?通常你会做'ORDER BY value desc LIMIT 1'这样的事情' – maxymoo
@maxymoo谢谢。它与分组有关,所以我更喜欢使用聚合函数。 – Jamin
@libenn编辑后,实际上maxymoo的方式可能是最简单的。由于您使用的是聚合函数,因此您要执行的操作不起作用,所有结果都必须是聚合函数结果或分组依据的列(在您的案例中为标签)。 –