Comment utiliser la Colonne.isin avec la liste?
val items = List("a", "b", "c")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items))
.collect
.foreach(println)
Le code ci-dessus lance l'exception suivante.
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)
Ci-dessous est ma tentative de le fixer. Il compile et s'exécute mais ne retourne pas n'importe quel match. Je ne sais pas pourquoi.
val items = List("a", "b", "c").mkString("\"","\",\"","\"")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items))
.collect
.foreach(println)
Vous devez vous connecter pour publier un commentaire.
Selon la documentation,
isin
prend un vararg, et non une liste. La liste est en fait une confusion de nom ici. Vous pouvez essayer de convertir votre Liste de vararg comme ceci:Votre variante avec mkString compile, car une seule Chaîne est également un vararg (avec nombre d'arguments égal à 1), mais il est proably pas ce que vous voulez atteindre.
Il a travaillé comme ceci dans l'Api Java (Java 8)
sampleListName une Liste
Encore plus facile:
Sauf si vous avez beaucoup de valeurs de la liste, ce qui n'est pas le cas habituellement.
Comme Tomalak a mentionné :
Par conséquent, vous avez juste à fixer le faire la modification suivante :
.filter($"c1".isin(List("a", "b", "c")))
serait de travailler.List("a", "b", "c").mkString("\"","\",\"","\"")
, je suppose que vous avez voulu entourer chaque élément par des guillemets doubles. La carte fait la même chose.