Spark

时间:2016-02-25 09:24:26

标签: join apache-spark pyspark similarity collect

我需要根据两列字符串的相似性在两个大数据集之间进行模糊连接(假设每个数据集为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),tokens):key1是table1中的键,key2是table2中的键,tokens是value1和value2之间的常用标记列表。对于CommonTokens中的每个元素,我计算生成相似度的余弦((key1,key2),相似度)。

在火花中,我做了:

  • collectAsMap RDD1,NORM1,RDD2,NORM2构建4个字典
  • 创建函数相似度:

    • 输入:(key1,key2,commonTokens)
    • 查找RDD1和NORM1中的key1,RDD2和NORM2中的key2
    • 计算余弦
    • return(key1,key2,similarity)
  • 在CommonTokens中应用具有上面定义的相似性函数的地图

  • 将我的工作提交给YARN的配置:
  

spark-submit --master yarn-client --executor-cores 3 --executor-memory   20G - driver-memory 20G --driver-cores 12 --queue cku --num-executors   6运行/ Join.py&

火花问题:

  • 很多CollectAsMap ==>超载驱动程序==>死锁
  • 不能在另一个RDD转换中进行RDD转换(而不是使用collectAsMap,直接使用RDD1,RDD2,NORM1,NORM2来查找keyT,在CommonTokens.Map内部的key2)
  • 我试图将RDD1,RDD2,NORM1,NORM2“转换”为数据帧,并使用Spark SQL“选择”(查找),但它在地图内部无法正常工作
  • 一个额外的问题是,如果我的算法对我的案例有效吗?

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

0 个答案:

没有答案