如果集合中存在列,则过滤spark/scala数据帧

如果集合中存在列,则过滤spark/scala数据帧,scala,apache-spark,filter,spark-dataframe,Scala,Apache Spark,Filter,Spark Dataframe,我使用的是Spark 1.4.0,这是我目前所拥有的: data.filter($"myColumn".in(lit("A"), lit("B"), lit("C"), ...)) 该函数将文字转换为列 理想情况下,我会将我的A、B、C放在一组中,并检查如下: val validValues = Set("A", "B", "C", ...) data.filter($"myColumn".in(validValues)) 正确的语法是什么?是否有其他简洁的解决方案?Spark 1.4或更早

我使用的是Spark 1.4.0,这是我目前所拥有的:

data.filter($"myColumn".in(lit("A"), lit("B"), lit("C"), ...))
该函数将文字转换为列

理想情况下,我会将我的A、B、C放在一组中,并检查如下:

val validValues = Set("A", "B", "C", ...)
data.filter($"myColumn".in(validValues))
正确的语法是什么?是否有其他简洁的解决方案?

Spark 1.4或更早版本:

val validValues = Set("A", "B", "C").map(lit(_))
data.filter($"myColumn".in(validValues.toSeq: _*))
Spark 1.5或更新版本:

val validValues = Set("A", "B", "C")
data.filter($"myColumn".isin(validValues.toSeq: _*))
已合并到Spark 2.4中。你现在可以做了

val profileDF = Seq(
  Some(1), Some(2), Some(3), Some(4),
  Some(5), Some(6), Some(7), None
).toDF("profileID")

val validUsers: Set[Any] = Set(6, 7.toShort, 8L, "3")

val result = profileDF.withColumn("isValid", $"profileID".isInCollection(validUsers))

result.show(10)
"""
+---------+-------+
|profileID|isValid|
+---------+-------+
|        1|  false|
|        2|  false|
|        3|   true|
|        4|  false|
|        5|  false|
|        6|   true|
|        7|   true|
|     null|   null|
+---------+-------+
 """.stripMargin

错误:类型不匹配;查找:Seq[String]required:Seq[org.apache.spark.sql.Column]另外,请您向我解释一下:“*”(我是新来的……)我已经更新了我的答案,因为它只在较新版本的spark中起作用。由于方法中的
接受
列*
作为其输入,我们必须使用
“:*”
语法将常规集合(
Seq[Column]
在本例中)转换为该集合的varargs版本(
列*
)为什么序列比哈希集更好?Seq的默认实现是List,它必须检查每个元素。hashset肯定使用固定时间访问,不是吗?我想它现在被称为
isInCollection