在Hive或Impala或Pig中按字符串匹配连接表

时间:2016-12-09 04:11:29

标签: sql hadoop hive apache-pig impala

我有两个表AB,其中B很大(2000万乘300),A中等大小(300k乘10)。 A包含一列是地址,B包含3列,可以放在一起形成正确的街道地址。例如,在A中,地址列可以是:

id  | Address
-----------
233 | 123 Main St

并在B我们可以:

Number  |  Street_name  | Street_suffix | Tax
------------------------------------------------
123     |  Main         | Street        | 320.2

我想使用类似于LIKE的字符串匹配来加入它们,如下所示:

select A.id, B.Tax
from A
  left join B
    on A.Address **contains** B.Number
    and A.Address **contains** B.Street_name;

基本上我试图匹配记录,说如果A的地址包含B的号码和street_name,那么我说它们是相同的地址(实际上,我也有城市,州和邮政编码。但我选择忽略那些用于说明目的。)

2包含部分是我不确定如何实现的东西。有什么想法吗?

我在Cloudera的Hue Hadoop发行版上,我可以访问Hive(1.1.0,不幸的是因为1.2.0具有Levenshtein距离功能),Impala(v2.3.0)和Pig(0.12.0-cdh5.5.0)

3 个答案:

答案 0 :(得分:0)

Hive连接有限制,您只能使用具有相等条件的连接。

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

如果您可以在逻辑上爆炸A.Address列,使其与表B列格式匹配,那么您可以在该列上使用join ....

答案 1 :(得分:0)

您只能在平等条件下使用联接, -
您可以交叉加入过滤

select      A.id, B.Tax
from        A cross join B
where       concat(' ',A.Address,' ') like concat('% ',cast(B.Number as string),' %')
        and concat(' ',A.Address,' ') like concat('% ',B.Street_name,' %')
;

演示

hive> create table A (id int,Address string);
OK
hive> create table B (number int,Street_name string,Street_suffix string,tax decimal(12,2));
OK
hive> insert into A values (233,'123 Main St');
Query ID = ...
OK
hive> insert into B values (123,'Main','Street',320.2);
Query ID = ...
OK
hive> select      A.id, B.Tax
    > from        A cross join B
    > where       concat(' ',A.Address,' ') like concat('% ',cast(B.Number as string),' %')
    >         and concat(' ',A.Address,' ') like concat('% ',B.Street_name,' %')
    > ;
Warning: Map Join MAPJOIN[8][bigTable=b] in task 'Stage-3:MAPRED' is a cross product
Query ID = ...
OK
233 320.2
hive> 

答案 2 :(得分:0)

首先,hive中的JOIN仅适用于相等条件

Refer here

所以你可以尝试使用like和concat操作的where条件,如下所示

select A.id, B.Tax
from A,B where A.Address LIKE CONCAT('%',cast(B.Number as string),'%') 
               AND
               A.Address LIKE CONCAT('%',B.Street_name,'%')