我需要根据两列字符串的相似性在两个大数据集之间进行模糊连接(假设每个数据集为30Gb) . 例如:
表格1:
Key1 |Value1
-------------
1 |qsdm fkq jmsk fqj msdk
表2:
Key2 |Value2
-------------
1 |qsdm fkqj mskf qjm sdk
我们的目的是计算value1的每一行与value2的每一行之间的相似性的余弦,之后,感谢thresold预定义,我可以加入两个表 .
关键词:实体分辨率,相似度余弦,倒排索引(优化相似度计算),TF-IDF,令牌权重,单词,文档(值列中的单元格),数据集
我使用Spark(PySpark)来计算连接 . 在进行的那一刻,我有:
-
一个(key1,dict1)的RDD RDD1:key1是table1的关键字,dict1是word的字典及其在数据集table1上的权重(权重向量)
-
一个(key2,dict2)的RDD RDD2:key2是table2的关键字,dict2是word的字典及其在数据集table2上的权重(权重向量)
-
一个(key1,norm1)的RDD NORM1:key1是table1的键,norm1是在dict1上预先计算的值
-
一个(key2,norm2)的RDD NORM2:key2是table2的键,norm2是在dict2上预先计算的值
使用倒排索引的策略,我减少了两个文档之间相似性的计算次数(字符串) . 它是一个RDD CommonTokens((key1,key2),令牌)数组:key1是table1中的键,key2是table2中的键,令牌是value1和value2之间的常用令牌列表 . 对于CommonTokens中的每个元素,我计算生成相似度的余弦((key1,key2),相似度) .
在火花中,我做了:
-
collectAsMap RDD1,NORM1,RDD2,NORM2构建4个词典
-
创建函数相似度:
-
输入:(key1,key2,commonTokens)
-
在RDD1和NORM1中查找key1,在RDD2和NORM2中查找key2
-
计算余弦值
-
return(key1,key2,相似度)
-
在CommonTokens中应用具有上面定义的相似性函数的 Map
-
配置将我的工作提交给YARN:
spark-submit --master yarn-client --executor-cores 3 --executor-memory 20G --driver-memory 20G --driver-cores 12 --queue cku --num-executors 6 run / Join.py&
火花问题:
-
很多CollectAsMap ==>重载驱动程序==>死锁
-
不能在另一个RDD转换中进行RDD转换(而不是使用collectAsMap,直接使用RDD1,RDD2,NORM1,NORM2来查找key1,在CommonTokens.Map内部的key2)
-
我试图将"convert" RDD1,RDD2,NORM1,NORM2添加到数据帧并使用Spark SQL到"select"(查找)但它在 Map 内部无效
-
一个额外的问题是,如果我的算法对我的案例有效吗?
感谢您的任何建议(对不起我的英文,如果我的问题不明确,请随时向我询问更多信息)