使用正则表达式优化连接

时间:2013-12-12 18:02:05

标签: regex optimization join hive

我有一个带有短语的表(A),另一个(B)是我要在表A的短语中找到的短语。所以我加入他们如下:

Create table C as
SELECT A.*
FROM A
JOIN B
where (A.phrase LIKE concat("%",B.phrase,"%"));

这需要很长时间,因为它只使用一个reducer,我相信这与查询的性质有关?有没有办法加速这个?我不认为mapjoin或bucketjoin会有所帮助,因为我不是在等两列,而是在一个表中搜索另一个表中的单词...

2 个答案:

答案 0 :(得分:3)

我找到了解决方案。

问题是Hive没有做好 non equi join 。所以我做了 equi join 来获取表A的一个子集,然后我做了非equi join正则表达式。所以,3个步骤。

  1. 将A.phrase和B.phrase分成单个单词。
  2. 将这些单词等同以查看来自B.phrase的哪些关键字等于来自A.phrase的任何关键字 - 这给出了表A的一个子集,其中A.phrase包含来自B.phrase的至少一个关键字。
  3. 使用此表子集查找整个“%B.phrase%”。

答案 1 :(得分:1)

我认为EXISTS可能更快,因为您的查询会在每次匹配时多次从A返回同一行:

SELECT 
   A.* 
FROM A as a
WHERE EXISTS (
  SELECT 
    1 
  FROM B 
  WHERE a.phrase LIKE concat("%",phrase,"%")
);