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

时间:2016-08-30 18:10:09

标签: scala apache-spark filter spark-dataframe

我使用Spark 1.4.0,这是我到目前为止所做的:

data.filter($"myColumn".in(lit("A"), lit("B"), lit("C"), ...))

函数lit将文字转换为列。

理想情况下,我会把我的A,B,C放在一个Set中并像这样检查:

val validValues = Set("A", "B", "C", ...)
data.filter($"myColumn".in(validValues))

正确的语法是什么?有没有其他简洁的解决方案?

2 个答案:

答案 0 :(得分:9)

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: _*))

答案 1 :(得分:5)

this PR合并到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".isinSet(validUsers))

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