【问题标题】:Join table by string matching in Hive or Impala or Pig通过 Hive 或 Impala 或 Pig 中的字符串匹配连接表
【发布时间】:2016-12-09 04:11:28
【问题描述】:

我有两个表 AB,其中 B 很大(2000 万乘 300),A 大小适中(300k x 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 的号码和街道名称来匹配记录,那么我说它们是相同的地址(实际上,我也有城市、州和邮政编码。但出于说明目的,我选择忽略这些)。

2 contains 部分是我不知道如何实现的东西。有什么想法吗?

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

【问题讨论】:

    标签: sql hadoop hive apache-pig impala


    【解决方案1】:

    您只能在相等条件下使用连接,但是 -
    您可以交叉加入过滤

    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】:

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

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

      如果您可以在逻辑上分解 A.Address 列以使其与表 B 列格式匹配,那么您可以在该列上使用连接 ....

      【讨论】:

        【解决方案3】:

        首先,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,'%')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多