val items = List("a", "b", "c") sqlContext.sql("select c1 from table") .filter($"c1".isin(items)) .collect .foreach(println)
上面的代码引发了以下异常。
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)
以下是我尝试解决的问题。它编译并运行,但不返回任何匹配。不知道为什么。
val items = List("a", "b", "c").mkString("\"","\",\"","\"") sqlContext.sql("select c1 from table") .filter($"c1".isin(items)) .collect .foreach(println)根据文档,isin需要一个vararg,而不是一个列表。列表其实是一个混乱的名字。您可以尝试将列表转换为vararg,如下所示:
val items = List("a", "b", "c") sqlContext.sql("select c1 from table") .filter($"c1".isin(items:_*)) .collect .foreach(println)
您的变体与mkString编译,因为一个单一的String也是一个vararg(参数的数量等于1),但它可能不是你想要实现的。
精彩评论