2017-07-14 9 views
1

正規表現を使用して結合を実装したいと思います。しかし、ハイブは不平等がハイブ:正規表現との結合

select a.col_1, b.col_2 
from table1 a left join table2 b 
on a.col_1 rlike b.col_2 

これに参加しない実際に動作しませんが、私はa.col_1の文字列にb.col2で全文をマッチさせたいです。これを行う方法はありますか?

例データセット:

**table1** 
apple iphone 
apple iphone 6s 
google nexus 
samsung galaxy tab 

**table2** 
apple 
google 
nexus 

**outcome** 
col1     col2 
apple iphone   apple 
apple iphone 6s  apple 
google nexus   google 
samsung galaxy tab null 
+0

あなたは、文字列操作を使用してcol1' 'に興味のある文字列を隔離たことにより、任意の論理がありますか?いくつかのサンプルデータがここで役立ちます。 –

+0

残念ながらそれはありません。私は検索キーワードを扱っています。そこで、table2のブランド「apple」をtable1のキーワード「apple iphone 6s」にマッチさせたいと思います。別の言い方をすると、table2 [full text]の中のいくつのキーワードがtable1のものと一致するかを見たいと思っています。 – user7088181

+0

@TimBiegeleisenはサンプルデータセットを追加しました – user7088181

答えて

1
select col1 
     ,col2 

from (select t1.col1 
       ,t2.col2 
       ,count  (col2) over (partition by col1)  as count_col2 
       ,row_number()  over (partition by col1,col2) as rn 

     from     (select * 

           from table1 t1 
             lateral view explode(split(col1,'\\s+')) e as token 
           ) t1 

       left join  (select * 

           from table2 t2 
             lateral view explode(split(col2,'\\s+')) e as token 
           ) t2 


       on    t2.token = 
           t1.token  
     ) t 

where ( count_col2 = 0 
     or col1 rlike concat ('\\b',col2,'\\b') 
     ) 

    and rn = 1 
; 

+--------------------+--------+ 
|  col1  | col2 | 
+--------------------+--------+ 
| apple iphone  | apple | 
| apple iphone 6s | apple | 
| google nexus  | google | 
| google nexus  | nexus | 
| samsung galaxy tab | (null) | 
+--------------------+--------+