Wie verwenden Sie die Spalte.isin-Liste?
val items = List("a", "b", "c")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items))
.collect
.foreach(println)
Den code oben wirft die folgende Ausnahme.
Exception in thread "main" java.lang.RuntimeException: Unsupported literal type class scala.collection.immutable.$colon$colon List(a, b, c)
at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:49)
at org.apache.spark.sql.functions$.lit(functions.scala:89)
at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:642)
at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:642)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
at scala.collection.AbstractTraversable.map(Traversable.scala:104)
at org.apache.spark.sql.Column.isin(Column.scala:642)
Unten ist mein Versuch, es zu beheben. Es kompiliert und läuft, aber nicht wieder jedes Spiel. Nicht sicher, warum.
val items = List("a", "b", "c").mkString("\"","\",\"","\"")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items))
.collect
.foreach(println)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut Dokumentation
isin
nimmt ein vararg, nicht eine Liste. Liste ist wirklich verwirrend mit den Namen hier. Sie können versuchen, konvertieren Sie Ihre Liste, um vararg wie diese:Ihre Variante mit mkString kompiliert, da eine single-String ist auch ein vararg (mit Anzahl der Argumente gleich 1 ist), aber es ist proably nicht das, was Sie erreichen wollen.
Er arbeitete, wie dies in Java-Api (Java 8)
sampleListName ist eine Liste
Sogar noch einfacher:
Es sei denn, Sie haben eine Menge von Listen-Werten, was nicht der Fall in der Regel.
Als Tomalak hat es erwähnt :
Daher, Sie nur dieses Problem beheben könnte folgende änderung :
.filter($"c1".isin(List("a", "b", "c")))
funktionieren würde.List("a", "b", "c").mkString("\"","\",\"","\"")
ich davon ausgegangen, dass Sie wollte, surround-jedes Element in doppelten Anführungszeichen. Die Karte macht das gleiche.