如预期星火过滤ISIN不起作用 [英] Spark filter isin doesn't work as expected

查看:716
本文介绍了如预期星火过滤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不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆