2017-02-22 7 views
1

私はHiveデータベースで動作するスカラー/スパークパッケージを持っています。これは、クエリが、データがある特定の値Hive-データを素早く確認する

SELECT * FROM myTable WHERE col1 = 7879 AND col2= 1071 AND col3= 3027 LIMIT 1; 

存在する場合、それは行を返すかどうかに基づいて進行チェックするために実行されるループを実行します。実行には約25秒かかります。私はこの方法は、カウントが0に

あるか否かに基づいて、

SELECT COUNT(*) FROM myTable WHERE col1 = 7879 AND col2= 1071 AND col3= 3027; 

と先に進むよりも速く動作することを見てきました

は、データがテーブルに存在するかどうかを確認するためのより高速な方法はあります特定の制約のために?

EDIT-ループは、結果として得られた別のクエリの行に基づいて実行されます(結果として100以上の行)。

答えて

0

ループをディッチします。
すべてのチェックを1回のクエリで実行します。

クエリを書くにはさまざまな方法がありますが、これは1つです(result_set_of_another_queryを(col1、col2、col3)の一意の組み合わせとして仮定します)。

select  q.col1 
      ,q.col2 
      ,q.col3 
      ,t.cnt 

from     result_set_of_another_query as q 

      join  (select  col1 
            ,col2 
            ,col3 
            ,count(*) as cnt 

         from  mytable 

         group by col1 
            ,col2 
            ,col3 
         ) t 

      on   t.col1 = q.col1 
        and t.col2 = q.col2 
        and t.col3 = q.col3 
; 
+0

更新された回答を確認する –

0

テーブルがパーティション化されていて、where clasueを使用できない場合。各パーティションに適切なデータがあることを確認するために、テーブル内のカウント(*)のみを実行できます。複数のテーブルをチェックインする場合は、すべて共用体を使用することもできます。

関連する問題