我需要根据两列字符串的相似性在两个大数据集之间进行模糊连接(假设每个数据集为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 内部无效

  • 一个额外的问题是,如果我的算法对我的案例有效吗?

感谢您的任何建议(对不起我的英文,如果我的问题不明确,请随时向我询问更多信息)