2016-03-17 101 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

编辑我的答案实际上,你知道,回答这个问题。 :) –