2017-02-22 36 views
0

У меня есть формат данных, приведенный ниже.Пересечение и объединение двух столбцов в dataframe

movieId1 | genreList1   | movieId2 | genreList2 
--------------------------------------------------------------- 
1  |[Adventure,Comedy] | 2  |[Adventure,Comedy] 
1  |[Animation,Drama] | 3  |[War,Drama] 

Dataframe схема является

StructType(
    StructField(movieId1,IntegerType,false),  
    StructField(genres1,ArrayType(StringType,true),true), 
    StructField(movieId2,IntegerType,false), 
    StructField(genres2,ArrayType(StringType,true),true) 
) 

мне было интересно, есть ли способ, чтобы создать новый dataframe с нового столбца, который является Jaccard коэффициент двух жанров подряд.

jaccardCoefficient(Set1, Set2) = (Set1 intersect Set2).size/(Set1 union Set2).size 

movieId1 | movieId2 | jaccardcoeff 
--------------------------------------------------------------- 
1  | 2  | 1 
1  | 3  | 0.5 

Любая помощь будет очень признательна. Благодарю.

ответ

2

Учитывая этот вход DataFrame:

+--------+-------------------+--------+-------------------+ 
|movieId1|   genreList1|movieId2|   genreList2| 
+--------+-------------------+--------+-------------------+ 
|  1|[Adventure, Comedy]|  2|[Adventure, Comedy]| 
|  1| [Animation, Drama]|  3|  [War, Drama]| 
+--------+-------------------+--------+-------------------+ 

со схемой:

StructType(
    StructField(movieId1,IntegerType,false),  
    StructField(genreList1,ArrayType(StringType,true),true),  
    StructField(movieId2,IntegerType,false),  
    StructField(genreList2,ArrayType(StringType,true),true)) 

Вы можете просто использовать UDF для расчета коэффициента Jaccard:

val jaccardCoefficient = udf { 
    (Set1: WrappedArray[String], Set2: WrappedArray[String]) => 
    (Set1.toList.intersect(Set2.toList)).size.toDouble/(Set1.toList.union(Set2.toList)).distinct.size.toDouble } 

Используйте эту UDF Пример:

input.withColumn("jaccardcoeff", jaccardCoefficient($"genreList1",$"genreList2")) 

получить свой disired вывод:

+--------+--------+------------+ 
|movieId1|movieId2|jaccardcoeff| 
+--------+--------+------------+ 
|  1|  2|   1| 
|  1|  3|  0.33333| 
+--------+--------+------------+ 
+0

Спасибо так много. – blessonm