Spark的Column.isin函数不带List

Posted

技术标签:

【中文标题】Spark的Column.isin函数不带List【英文标题】:Spark's Column.isin function does not take List 【发布时间】:2016-04-12 02:37:49 【问题描述】:

我正在尝试从我的 Spark 数据框中过滤掉行。

val sequence = Seq(1,2,3,4,5)
df.filter(df("column").isin(sequence))

很遗憾,我收到了不支持的文字类型错误

java.lang.RuntimeException: Unsupported literal type class scala.collection.immutable.$colon$colon List(1,2,3,4,5)

根据documentation,它需要一个 scala.collection.Seq 列表

我想我不想要文字?那我能接受什么,某种包装类?

【问题讨论】:

【参考方案1】:

@JustinPihony 的回答是正确的,但并不完整。 isin 函数接受一个重复参数作为参数,所以你需要这样传递它:

scala> val df = sc.parallelize(Seq(1,2,3,4,5,6,7,8,9)).toDF("column")
// df: org.apache.spark.sql.DataFrame = [column: int]

scala> val sequence = Seq(1,2,3,4,5)
// sequence: Seq[Int] = List(1, 2, 3, 4, 5)

scala> val result = df.filter(df("column").isin(sequence : _*))
// result: org.apache.spark.sql.DataFrame = [column: int]

scala> result.show
// +------+
// |column|
// +------+
// |     1|
// |     2|
// |     3|
// |     4|
// |     5|
// +------+

【讨论】:

这也帮助我了解***.com/questions/6051302/… 发生了什么 这一切都在 Scala 语言规范中。 :)【参考方案2】:

发生这种情况是因为底层的Scala implementation uses varargs,所以Java 中的文档不太正确。它使用@varargs注解,所以你可以just pass in an array.

【讨论】:

以上是关于Spark的Column.isin函数不带List的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Column.isin 与列表一起使用?

spark 的一些常用函数 filter,map,flatMap,lookup ,reduce,groupByKey

极简spark教程spark聚合函数

Spark(1.6) Densevector.type 不带参数

STL的list里自带sort函数吧~那vector和deque带不带呢?就是可不可以 v.sort() 或 q.sort ()呢?

通过 Spark SQL 实现 `collect_list`