如果一列是另一列的成员,如何过滤Spark数据框架



我有一个数据框架,有两列(一个字符串和一个字符串数组):

root
 |-- user: string (nullable = true)
 |-- users: array (nullable = true)
 |    |-- element: string (containsNull = true)

如何过滤数据框,使结果数据框只包含userusers中的行?

快速和简单:

import org.apache.spark.sql.functions.expr
df.where(expr("array_contains(users, user)")

当然,这是可能的,也不是那么难。为了达到这个目的,你可以使用UDF

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
val df = sc.parallelize(Array(
  ("1", Array("1", "2", "3")),
  ("2", Array("1", "2", "2", "3")),
  ("3", Array("1", "2"))
)).toDF("user", "users")
val inArray = udf((id: String, array: scala.collection.mutable.WrappedArray[String]) => array.contains(id), BooleanType)
df.where(inArray($"user", $"users")).show()

输出为:

+----+------------+
|user|       users|
+----+------------+
|   1|   [1, 2, 3]|
|   2|[1, 2, 2, 3]|
+----+------------+

相关内容

  • 没有找到相关文章

最新更新