2016-12-09 2 views
1

Ich habe zwei Tabellen A und B, wo B ist riesig (20 Millionen von 300) und A ist von mittlerer Größe (300k von 10). A enthält eine Spalte, die Adresse ist und B 3 Spalten enthält, die zu einer richtigen Adresse zusammengefügt werden können. Zum Beispiel in A könnte die Adressspalte sein:Join Tabelle durch String-Matching in Hive oder Impala oder Pig

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

und in B konnten wir haben:

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

Ich möchte sie verbinden Zeichenfolge mit ähnlichen passend zu LIKE mit etwas wie folgt aus:

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

Grundsätzlich versuche ich sagen, dass die Datensätze übereinstimmen, wenn A ‚s-Adresse enthält B 's Nummer und street_name, dann sage ich, dass sie die gleiche Adresse sind (In Wirklichkeit habe ich auch Stadt, Staat und Postleitzahl. Aber ich entschied mich, diese zur Veranschaulichung zu ignorieren).

Die 2 enthält Teil ist etwas, ich bin mir nicht sicher, wie zu implementieren. Irgendwelche Ideen?

Ich bin auf Cloudera Hue Hadoop Verteilung, wo ich Zugang zu Hive (1.1.0, leider weil 1.2.0 hat Levenshtein Abstand Funktion), Impala (v2.3.0) und Pig (0.12.0-cdh5.5.0).

Antwort

0

Sie können mit Gleichheit verwenden beitreten nur Bedingungen, aber-
Sie können Cross Join und Filter.

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

Demo

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> 
0

Zu allererst

Refer here

So können Sie versuchen, die in dem Zustand mit wie und concat JOINs in Bienenstock nur mit Gleichheitsbedingungen arbeiten Betrieb wie unter