如果集合中存在列,则过滤spark/scala数据帧
我使用的是Spark 1.4.0,这是我目前所拥有的:如果集合中存在列,则过滤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或更早
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