閔我新的火花,我對自己在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的方式可能是最簡單的。由於您使用的是聚合函數,因此您要執行的操作不起作用,所有結果都必須是聚合函數結果或分組依據的列(在您的案例中爲標籤)。 –