Angesichts eines Spark DataFrame , ich möchte den maximalen Wert in einer bestimmten numerischen Spalte 'values'
finden, und erhalten Sie die Zeile (n), wo dieser Wert erreicht wurde. Ich kann dies natürlich tun:argmax in Spark DataFrames: wie die Zeile mit dem maximalen Wert abgerufen wird
# it doesn't matter if I use scala or python,
# since I hope I get this done with DataFrame API
import pyspark.sql.functions as F
max_value = df.select(F.max('values')).collect()[0][0]
df.filter(df.values == max_value).show()
aber dies ist ineffizient, da es zwei Durchgänge durch df
erfordert.
pandas.Series
/DataFrame
und numpy.array
haben argmax
/idxmax
Methoden, die dies effizient zu tun (in einem Durchgang). Dies gilt auch für Standard-Python (die integrierte Funktion max
akzeptiert einen Schlüsselparameter, damit der Index des höchsten Werts gefunden werden kann).
Was ist der richtige Ansatz in Spark? Beachten Sie, dass es mir nichts ausmacht, ob ich alle Zeilen, in denen der Maximalwert erreicht wird, oder nur eine beliebige (nicht leere!) Teilmenge dieser Zeilen bekomme.
In der Regel gibt es keine bessere Lösung ist, die sprachübergreifende und auf beliebige Daten arbeiten können. – zero323
@ zero323 Warum ist es unmöglich, den RDD-Code in der Antwort unten in einer DataFrame-API zu verpacken, indem man ihn in Scala umwandelt und richtige Metadaten für Catalyst hinzufügt, um daran zu arbeiten? – max
Es ist möglich, aber es bricht eindeutig die Annahme, dass _it es egal ist, wenn Sie Scala oder Python verwenden_ Sie können es auch mit Ordnable Datentypen mit SQL allein tun, aber dies ist ein Sonderfall nicht allgemeine Lösung. – zero323