基于子串匹配的蜂窝/猪连接 [英] HIVE/PIG JOIN Based on SUBSTRING match

查看:31
本文介绍了基于子串匹配的蜂窝/猪连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个要求,我需要使用人名加入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;

  1. 我建议将推文拆分成单独的单词。是,使您的记录计数成倍增加。
  2. 筛选出内存中可以容纳的"停用词"或某些其他单词列表。
  3. 将姓名拆分为(名字)和姓氏(&q;)
  4. 连接";lastname";和instr(t.tweet, p.person_name)上的tweet和name,这将显著减少您通过函数比较的数据大小。它会运行得更快。
如果要定期执行此操作,请考虑使用以下命令创建表 分类/桶,真正让东西发出嘶嘶声。(使其更快,因为它有望准备好排序合并联接。)

这篇关于基于子串匹配的蜂窝/猪连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆