基于子串匹配的蜂窝/猪连接 [英] HIVE/PIG JOIN Based on SUBSTRING match
本文介绍了基于子串匹配的蜂窝/猪连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个要求,我需要使用人名加入twets表,比如过滤包含任何人名的tweet。我有以下数据:
推文表:(7000万条记录存储为一个配置单元表)
id | 推文 |
---|---|
1 | 克里斯蒂亚诺·罗纳尔多有史以来最伟大的 |
2 | 布拉德·皮特电影 |
3 | 无人名的随机推文 |
人名:(160万个姓名以.tsv文件形式存储在HDFS上)
id | PERSON_NAME |
---|---|
1 | 克里斯蒂亚诺·罗纳尔多 |
2 | 布拉德·皮特 |
3 | 安吉丽娜·朱莉 |
预期结果:
id | 推文 | PERSON_NAME |
---|---|---|
1 | 克里斯蒂亚诺·罗纳尔多有史以来最伟大的 | 克里斯蒂亚诺·罗纳尔多 |
2 | 布拉德·皮特电影 | 布拉德·皮特 |
到目前为止我尝试的内容:
我还将人名.tsv文件转换为配置单元表,然后尝试使用以下配置单元查询联接两个表:
SELECT * FROM tweets t INNER JOIN people p WHERE instr(t.tweet, p.person_name) > 0;
尝试了一些示例数据,运行良好。但当我试图运行整个数据(7000万条tweet和160万个人名)时,它永远都要花费很长时间。看起来肯定不是很有效率。
我也想尝试与PIG连接(因为它被认为比配置单元连接效率略高),我可以直接连接人名.tsv文件twets配置单元表,但不确定如何根据PIG中的子字符串进行连接。
如果您有什么想法,能不能请大家分享一下这个问题的PIG连接语法?另外,请给我推荐一些我可以使用的替代品?
推荐答案
我们的想法是创建存储桶,这样我们就不必比较很多记录。我们将增加记录/联接的数量,以使用多个节点来执行工作,而不是使用大型交叉联接。-->;WHERE instr(t.tweet, p.person_name) > 0;
- 我建议将推文拆分成单独的单词。是,使您的记录计数成倍增加。
- 筛选出内存中可以容纳的"停用词"或某些其他单词列表。
- 将姓名拆分为(名字)和姓氏(&q;)
- 连接";lastname";和
instr(t.tweet, p.person_name)
上的tweet和name,这将显著减少您通过函数比较的数据大小。它会运行得更快。
这篇关于基于子串匹配的蜂窝/猪连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文