Ich bin in Schwierigkeiten versucht, Zeilen aus Dataframe basierend auf zweispaltige Liste der Elemente zu filtern zu entfernen. Zum Beispiel für diesen Datenrahmen:Kann Array-Literal in spark/pyspark nicht erstellen
df = spark.createDataFrame([(100, 'A', 304), (200, 'B', 305), (300, 'C', 306)], ['number', 'letter', 'id'])
df.show()
+------+------+---+
|number|letter| id|
+------+------+---+
| 100| A|304|
| 200| B|305|
| 300| C|306|
+------+------+---+
ich leicht Reihen entfernen isin
auf einer Spalte:
df.where(~col('number').isin([100, 200])).show()
+------+------+---+
|number|letter| id|
+------+------+---+
| 300| C|306|
+------+------+---+
Aber wenn ich versuche, sie durch zwei Spalten zu entfernen erhalte ich eine Ausnahme:
df.where(~array('number', 'letter').isin([(100, 'A'), (200, 'B')])).show()
Py4JJavaError: An error occurred while calling z:org.apache.spark.sql.functions.lit.
: java.lang.RuntimeException: Unsupported literal type class java.util.ArrayList [100, A]
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:57)
at org.apache.spark.sql.functions$.lit(functions.scala:101)
at org.apache.spark.sql.functions.lit(functions.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237)
at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
at py4j.Gateway.invoke(Gateway.java:280)
at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
at py4j.commands.CallCommand.execute(CallCommand.java:79)
at py4j.GatewayConnection.run(GatewayConnection.java:214)
at java.lang.Thread.run(Thread.java:745)
Nach einigen Untersuchungen erkannte ich, dass die Ursache des Problems Literale von nicht-primitiven Typen erstellt. Ich habe versucht, den folgenden Code in pyspark:
lit((100, 'A'))
lit([100, 'A'])
und folgende Unterlagen in scala-Funke:
lit((100, "A"))
lit(List(100, "A"))
lit(Seq(100, "A"))
lit(Array(100, "A"))
aber ohne Glück ... Kennt jemand die Art und Weise Arrayliteral in Funken/pyspark zu erstellen ? Oder gibt es eine andere Methode, um Datenrahmen um zwei Spalten zu filtern?