복붙노트

[HADOOP] Hive, Impala 또는 Pig에서 문자열 일치로 테이블 조인

HADOOP

Hive, Impala 또는 Pig에서 문자열 일치로 테이블 조인

두 개의 테이블 A와 B가 있습니다. 여기서 B는 거대하고 (2 천만 x 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의 번호와 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)에 액세스 할 수 있습니다.

해결법

  1. ==============================

    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. ==============================

    2.하이브 조인에는 제한 조건이있는 조인 만 사용할 수있는 제한이 있습니다.

    하이브 조인에는 제한 조건이있는 조인 만 사용할 수있는 제한이 있습니다.

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

    테이블 B 열 형식과 일치하도록 A.Address 열을 논리적으로 분해 할 수 있으면 해당 열에서 조인을 사용할 수 있습니다.

  3. ==============================

    3.우선, 하이브의 JOIN은 평등 조건에서만 작동합니다.

    우선, 하이브의 JOIN은 평등 조건에서만 작동합니다.

    여기를 참조하십시오

    따라서 아래와 같이 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,'%')
    
  4. from https://stackoverflow.com/questions/41052959/join-table-by-string-matching-in-hive-or-impala-or-pig by cc-by-sa and MIT license