2016-09-10 53 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

相關問題