2016-09-10 51 views
4

我有两列(一个串和串的一个阵列)一个数据帧中的一员:如何过滤火花数据帧,如果一列是另一个列

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

如何过滤数据帧,使得结果数据帧仅包含userusers中的行?

回答

4

当然,这是可能的,并不难。要达到此目的,您可以使用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]| 
+----+------------+ 
6

快速而简单:

import org.apache.spark.sql.functions.expr 

df.where(expr("array_contains(users, user)") 
+0

谢谢。这个和接受的一个工作,但我只能接受一个作为答案。 – Rainfield

相关问题