2016-03-17 140 views
0

閔我新的火花,我對自己在SparkSQLMax和星火

在SparkSQL聚合函數MAXMIN一些問題,當我使用MAX/MIN函數只返回MAX(value)/MIN(value)。 但是如果我還想要其他相應的列呢?

例如,給定與列time,valuelabel的數據幀,我怎麼能得到timeMIN(Value)分組label

謝謝。

+0

你知道如何在常規的SQL這樣做呢?通常你會做'ORDER BY value desc LIMIT 1'這樣的事情' – maxymoo

+0

@maxymoo謝謝。它與分組有關,所以我更喜歡使用聚合函數。 – Jamin

+0

@libenn編輯後,實際上maxymoo的方式可能是最簡單的。由於您使用的是聚合函數,因此您要執行的操作不起作用,所有結果都必須是聚合函數結果或分組依據的列(在您的案例中爲標籤)。 –

回答

-1

您可以使用sortByKey(true)按升序排序,然後應用「take(1)」操作以獲取最大值。

並使用sortByKey(假)由降序排序,然後應用行動「採取(1)」獲得閔

如果你想使用火花-SQL的方式,你可以採取的辦法由@解釋maxymoo

1

您需要先做一個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") 
+0

這不會返回'時間'列,這就是OP想要 –

+0

錯誤的問題。等一下。 –

+0

編輯我的答案實際上,你知道,回答這個問題。 :) –