apache-spark - 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
解决方案
我们将无法嵌套循环它。但是,我们可以加入并将其传递给函数
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
}
推荐阅读
- c# - 来自 asmx Web 服务的“请求失败,响应为空”
- regex - 在eclipse中删除行而不是用空替换
- sql - 左侧连接表的快速刷新需要这么多次
- apache - Apache ReverseProxy Netscaler Gateway 中止请求,因为 Set-Cookie 中的字符无效
- c++ - 如何在 C/C++ 中正确实现链接列表而不会导致程序崩溃
- ajax - 带有ajax分页的Django Rest框架,如何在模板中切换数据?
- php - 无法在一行中获取一个 ID 和另一个同名 ID?
- android - FFMPEG 幻灯片 - 仅显示第一帧
- django - django 注册用户为超级用户
- xml - xpath 请求选择恰好出现两次的元素