[HADOOP] Hive, Impala 또는 Pig에서 문자열 일치로 테이블 조인
HADOOPHive, 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.동등 조건에서만 조인을 사용할 수 있지만- 교차 조인 및 필터링 할 수 있습니다.
동등 조건에서만 조인을 사용할 수 있지만- 교차 조인 및 필터링 할 수 있습니다.
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.하이브 조인에는 제한 조건이있는 조인 만 사용할 수있는 제한이 있습니다.
하이브 조인에는 제한 조건이있는 조인 만 사용할 수있는 제한이 있습니다.
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins
테이블 B 열 형식과 일치하도록 A.Address 열을 논리적으로 분해 할 수 있으면 해당 열에서 조인을 사용할 수 있습니다.
-
==============================
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,'%')
from https://stackoverflow.com/questions/41052959/join-table-by-string-matching-in-hive-or-impala-or-pig by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Mapreduce XML 입력 형식-사용자 정의 형식 작성 (0) | 2019.09.15 |
---|---|
[HADOOP] Tez 및 Map reduce에서 "count (*)"를 실행하는 동안 동작의 차이 (0) | 2019.09.15 |
[HADOOP] HADOOP-간단한 MR 작업에서 위상 중단을 줄입니다 (0) | 2019.09.15 |
[HADOOP] hadoop이 서비스를 시작하기 전에 비밀번호를 묻는 이유는 무엇입니까? (0) | 2019.09.15 |
[HADOOP] Hadoop에서 Python을 사용하여 map reduce를 실행할 수 없습니까? (0) | 2019.09.15 |