1

Hiveを使用して電話番号を地域に一致させようとしています。番号プレフィックス(prefix)をエリア(area)にマップするテーブル(prefmap)と、電話番号(nb)のリストを含む別のテーブル(users)があります。電話番号ごとに一致するのは1つだけです(サブエリアなし)

問題は、プレフィックスの長さが固定されていないため、JOINのON()条件でUDF関数substr(nb、 "prefix's length")を使用して、数値のサブストリングをプレフィックスに一致させることができないことです。

そして、instr()を使用して、番号に一致するプレフィックスがあるかどうかを調べようとすると、次のようになります。

SELECT users.nb,prefix.area
FROM users 
LEFT OUTER JOIN prefix 
ON (instr(prefmap.prefix,users.nb)=1)

line4でエラーが発生します"Join'1'で左と右の両方のエイリアスが見つかりました)

どうすればこれを機能させることができますか?私はハイブ0.9を使用しています。アドバイスをありがとう。

4

2 に答える 2

4

おそらく最良の解決策ではありませんが、少なくともそれは仕事をします: WHERE を使用して、ON() の代わりに一致条件を定義します (現在は TRUE に強制されています)。

select users.nb, prefix.area  
from users  
LEFT OUTER JOIN prefix  
ON(true)  
WHERE instr(users.nb,prefmap.prefix)=1  

少し遅いので完璧ではありません。WHERE条件が唯一の正しいものを保持する前に、一致するテーブルにあるのと同じ数の一時的な(役に立たない)エントリを作成します。そのため、長すぎない場合にのみ使用することをお勧めします。誰でもこれを行うためのより良い方法を考えることができますか?

于 2012-10-25T14:47:52.513 に答える