ich einen Datensatz wie dieses:withColumn erlaubt mir nicht max() Funktion zu verwenden, um eine neue Spalte zu erzeugen
a = sc.parallelize([[1,2,3],[0,2,1],[9,8,7]]).toDF(["one", "two", "three"])
Ich möchte einen Datensatz haben, die eine neue Spalte hinzufügt, die auf den größten Wert gleich in den anderen drei Spalten. Die Ausgabe würde wie folgt aussehen:
+----+----+-----+-------+
|one |two |three|max_col|
+----+----+-----+-------+
| 1| 2| 3| 3|
| 0| 2| 1| 2|
| 9| 8| 7| 9|
+----+----+-----+-------+
Ich dachte, ich withColumn
, wie so verwenden würde:
b = a.withColumn("max_col", max(a["one"], a["two"], a["three"]))
aber dies ergibt den Fehler
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/spark152/python/pyspark/sql/column.py", line 418, in __nonzero__
raise ValueError("Cannot convert column into bool: please use '&' for 'and', '|' for 'or', "
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.
Odd. Gibt max
eine bool
zurück? Nicht nach the documentation on max
. Okay. Seltsam.
Ich finde es seltsam, dass dies funktioniert:
b = a.withColumn("max_col", a["one"] + a["two"] + a["three"]))
Und die Tatsache, dass es funktioniert, lässt mich denken, noch stärker, dass max
in gewisser Weise verhält Ich verstehe nicht.
Ich versuchte auch b = a.withColumn("max_col", max([a["one"], a["two"], a["three"]]))
, die in den drei Spalten als eine Liste statt 3 septe Elemente übergibt. Dies ergibt denselben Fehler wie oben.
Leider hat das nicht für mich funktioniert. Sicher, es ist ein kleines Problem/Bug, da du keine Chance zum Testen bekommen hast. Ich würde lieber DataFrames anstelle von RDDs verwenden, also wenn Sie eine funktionierende Lösung finden, würde ich es schätzen! –