本文介绍了如预期星火过滤ISIN不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
VAL项目=列表(A,B,C)sqlContext.sql(选择表C1)
.filter($C1.isin(项目))
。搜集
.foreach(的println)
上面的code抛出以下异常。
异常螺纹主了java.lang.RuntimeException:不支持文本类型类scala.collection.immutable $结肠结肠$表(A,B,C)
在org.apache.spark.sql.catalyst.ex pressions.Literal $。适用(literals.scala:49)
在org.apache.spark.sql.functions $ .LIT(functions.scala:89)
在org.apache.spark.sql.Column $$ anonfun $ ISIN $ 1.适用(Column.scala:642)
在org.apache.spark.sql.Column $$ anonfun $ ISIN $ 1.适用(Column.scala:642)
在scala.collection.TraversableLike $$ anonfun $ $图1.适用(TraversableLike.scala:245)
在scala.collection.TraversableLike $$ anonfun $ $图1.适用(TraversableLike.scala:245)
在scala.collection.IndexedSeqOptimized $ class.foreach(IndexedSeqOptimized.scala:33)
在scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35)
在scala.collection.TraversableLike $ class.map(TraversableLike.scala:245)
在scala.collection.AbstractTraversable.map(Traversable.scala:104)
在org.apache.spark.sql.Column.isin(Column.scala:642)
下面是我试图修复它。它编译和运行,但不会返回任何比赛。不知道为什么。
VAL项目=列表(A,B,C)。mkString(\\,\\,\\,\\)sqlContext.sql(选择表C1)
.filter($C1.isin(项目))
。搜集
.foreach(的println)
解决方案
据文档, ISIN
需要一个可变参数,而不是一个列表。名单其实是这里的混乱的名字。您可以尝试转换您的清单可变参数是这样的:
VAL项目=列表(A,B,C)sqlContext.sql(选择表C1)
.filter($C1.isin(项目:_ *))
。搜集
.foreach(的println)
您与mkString变种编译,因为一个单一的字符串也是一个可变参数(与参数等于1号),但它是proably不是你想要达到的目标。
val items = List("a", "b", "c")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items))
.collect
.foreach(println)
The code above throws the following exception.
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)
Below is my attempt to fix it. It compiles and runs but doesn't return any match. Not sure why.
val items = List("a", "b", "c").mkString("\"","\",\"","\"")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items))
.collect
.foreach(println)
解决方案
According to documentation, isin
takes a vararg, not a list. List is actually a confusing name here. You can try converting your List to vararg like this:
val items = List("a", "b", "c")
sqlContext.sql("select c1 from table")
.filter($"c1".isin(items:_*))
.collect
.foreach(println)
Your variant with mkString compiles, because one single String is also a vararg (with number of arguments equal to 1), but it is proably not what you want to achieve.
这篇关于如预期星火过滤ISIN不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!