Ich versuche herauszufinden, wie man den größten Wert in einer Spark-Dataframe-Spalte am besten erhält.Der beste Weg, um den maximalen Wert in einer Spark-Datenframesspalte zu erhalten
Betrachten Sie das folgende Beispiel:
df = spark.createDataFrame([(1., 4.), (2., 5.), (3., 6.)], ["A", "B"])
df.show()
Welche schafft:
+---+---+
| A| B|
+---+---+
|1.0|4.0|
|2.0|5.0|
|3.0|6.0|
+---+---+
Mein Ziel ist es, den größten Wert in Spalte A zu finden (durch Inspektion, ist dies 3,0). Mit PySpark, sind hier vier Ansätze, die ich denken kann:
# Method 1: Use describe()
float(df.describe("A").filter("summary = 'max'").select("A").collect()[0].asDict()['A'])
# Method 2: Use SQL
df.registerTempTable("df_table")
spark.sql("SELECT MAX(A) as maxval FROM df_table").collect()[0].asDict()['maxval']
# Method 3: Use groupby()
df.groupby().max('A').collect()[0].asDict()['max(A)']
# Method 4: Convert to RDD
df.select("A").rdd.max()[0]
Jede der oben gibt die richtige Antwort, aber in Abwesenheit eines Spark Profilierungswerkzeuges kann ich nicht sagen, was am besten ist.
Irgendwelche Ideen aus Intuition oder Empirismus, welche der oben genannten Methoden hinsichtlich Spark-Laufzeit oder Ressourcennutzung am effizientesten sind, oder ob es eine direktere Methode als die oben genannten gibt?
Die Methoden 2 und 3 sind äquivalent und verwenden identische physische und optimierte logische Pläne. Methode 4 wendet Reduzieren mit max auf rdd an. Es kann langsamer sein als direkt auf einem DataFrame zu arbeiten. Methode 1 entspricht mehr oder weniger 2 und 3. – zero323
@ zero323 Was ist mit 'df.select (max (" A ")). Collect() [0] .asDict() ['max (A)']'? Sieht äquivalent zu Methode 2 aus, ist jedoch kompakter und auch intuitiver als Methode 3. – desertnaut
- Am langsamsten ist die Methode 4, weil Sie die Umwandlung von DF in RDD für die gesamte Spalte durchführen und dann den Maximalwert extrahieren. –