我有一个数据框架,有两列(一个字符串和一个字符串数组):
root
|-- user: string (nullable = true)
|-- users: array (nullable = true)
| |-- element: string (containsNull = true)
如何过滤数据框,使结果数据框只包含user
在users
中的行?
快速和简单:
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]|
+----+------------+