2017-03-15 15 views
2

私は2つのテーブルに1つ約17K(NLIST)のレコードを含み、もう1つの57K(FNAMES)のテーブルを持っています。ハイヴァインまたはインパラでlevenshteinに参加する効率的な方法

私はlevenshtein式を使ってレコードを比較することで両方に参加したいと思います。ここ

は、テーブルのコンテンツの一例である。

NLIST

+------+-------------+ 
| ID | S_NAME | 
+------+-------------+ 
| 1 | Avi  | 
| 2 | Moshe  | 
| 3 | David  | 
.... 

FNAMES

+------+-------------+ 
| ID | NICKNAMES | 
+------+-------------+ 
| 1 | Avile  | 
| 2 | Dudi  | 
| 3 | Moshiko | 
| 4 | Avi  | 
| 5 | DAVE  | 
.... 

上記の表は単なる例です。実際の場合、名前列には複数の単語を含めることができます。

必要な結果は次のようになります。ここでは

+------+-------------+--------+ 
| ID | NICKNAMES | S_NAME | 
+------+-------------+--------+ 
| 1 | Avile  | Avi | 
| 2 | Dudi  | David | 
| 3 | Moshiko | Moshe | 
| 4 | Avi  | Avi | 
| 5 | DAVE  | David | 
... 

は、私が使用するコードです:

select FNAMES.NICKNAMES, NLIST.S_NAME 
from NICKNAMES 
LEFT OUTER JOIN NLIST 
ON(true) 
WHERE levenshtein (FNAMES.NICKNAMES, NLIST.S_NAME) <=4 

上記のコードは非常に長い時間のために実行され、私はその実行を停止しました。

妥当な時間に実行するにはどうすればよいですか?

また、私はlevenshteinの距離は単語の長さに依存すると思います。どのように距離の最適値を見つけることができますか(この場合、私は任意に4を選択しました)?

+0

Avi、最初に、両方のテーブルから**個別の値**を使用しましたか? –

+0

ありがとうございましたDudu、確かにそうでした。 NLIST表はすでに別個の表であり、FNAMES表には重複値がありません。 – Avi

答えて

-2

Hiveテーブルのパフォーマンスはさまざまな点によって異なります。

  • クエリエンジンE
  • ファイル形式
  • 利用ベクトルset hive.vectorized.execution.enabled = true;set hive.vectorized.execution.reduce.enabled = true;

あなたが良いサーバーを持っている場合は、Impalaで試すことができますし、間違いなくそれはHiveよりも高速です。

impalaの微調整を行うと、このクエリを高速に実行できるようになります。 Tuning Impala for Performance