首页 > 解决方案 > DataFrame 元素的成对比较

问题描述

如何对列进行成对迭代以查找相似性。

对于来自一个数据框的所有列的所有元素,要与来自另一个数据框的所有列的所有元素进行比较。

例如:

df1 有两个字段名称和年龄

姓名,年龄
“Ajay Malhotra”,28
“Sujata Krishanan”,27
“Madhav Shankar”,33

df2 有两个字段 UserId & EmpId, eMail

“用户 ID”、“员工 ID”、“电子邮件”
--------------------------
“Ajay.Malhotra”,100,“a.malt@nothing.com”,
“Madhav.Shankar”,101,“m.shankar”,
“Sujata.Kris”,1001,“Kris.Suja@nothing.com”


一些给出匹配值的方法 可以一些硬编码 0.73 作为例子

def chekIfSame(leftString: String, rightString: String): Double = { // Some Logic ..Gives a MatchValue 0.73 }

如何从 df_1 获取每个列,从 df2 获取每个列,并将其传递给 chekIfSame。
输出可能是这样的笛卡尔积

名称,用户 ID,匹配值
--------------------------
“Sujata Krishanan”,Sujata。 Kris, 0.85
"Ajay Malhotra", Ajay.Malhotra , 0.98
"Ajay Malhotra", Sujata.Kris , 0.07

标签: apache-sparkapache-spark-sql

解决方案


每个循环嵌套两个 DataFrame

我们将无法嵌套循环它。但是,我们可以加入并将其传递给函数

joined = leftDf.join(rightDf)
val joinedWithScore = joined.withColumn("simlarScore", chekIfSame( joined(ltColName) , joined(rtColName)))

为此,我们需要在 chekIfSame 中将其作为 UDF 在上述操作之前。

def checkSimilarity = udf((left:String,right:String):Double => { 
// Logic or hard code 0..73
0.73

}


推荐阅读