2016-12-08 3 views
0

私は毎日更新される取引テーブルtable_Aを持っています。毎日私はtable_Aに新しいデータを挿入し、file_dateフィールドを使用して外部table_Bから必要なデータをフィルタリングしてtable_Aに挿入します。私はハイブの日付関数を使用して対ハードコードされた日付を使用する場合は、巨大なパフォーマンスの違いがあります:に比べハードコードされた日付文字列の代わりにHive日付関数を使用すると、ハイブクエリのパフォーマンスが低下しますか?

-- Fast version (~20 minutes) 
SET date_ingest = '2016-12-07'; 
SET hive.exec.dynamic.partition.mode = nonstrict; 
SET hive.exec.dynamic.partition = TRUE; 

INSERT 
    INTO 
     TABLE 
      table_A PARTITION (FILE_DATE) SELECT 
        id, eventtime 
        ,CONCAT_WS('-' ,substr (eventtime ,0 ,4) ,SUBSTRING(eventtime ,5 ,2) ,SUBSTRING(eventtime ,7 ,2)) 
       FROM 
        table_B 
       WHERE 
        file_date = ${hiveconf:date_ingest} 
; 

-- Slow version (~9 hours) 
SET date_ingest = date_add(to_date(from_unixtime(unix_timestamp())),-1); 
SET hive.exec.dynamic.partition.mode = nonstrict; 
SET hive.exec.dynamic.partition = TRUE; 

INSERT 
    INTO 
     TABLE 
      table_A PARTITION (FILE_DATE) SELECT 
        id, eventtime 
        ,CONCAT_WS('-' ,substr (eventtime ,0 ,4) ,SUBSTRING(eventtime ,5 ,2) ,SUBSTRING(eventtime ,7 ,2)) 
       FROM 
        table_B 
       WHERE 
        file_date = ${hiveconf:date_ingest} 
; 

は、誰でも同様の問題を経験していますか?サードパーティ製のUIを使用しているので、私はUnixハイブコマンドにアクセスできない(つまり、 - hiveconfオプションを使用できない)と仮定する必要があります。

答えて

0

フィルタ節で関数を使用しているときに、パーティションのプルーニングが機能しないことがあります。ラッパーシェルスクリプトの変数を計算し、それを-hiveconf変数としてHiveに渡すと正常に動作します。 例:

#inside shell script 
date_ingest=$(date -d '-1 day' +%Y-%m-%d) 
hive -f your_script.hql -hiveconf date_ingest="$date_ingest" 

その後、残念ながら、我々はUnixコマンドラインへのアクセスを持っていないWHERE file_date ='${hiveconf:date_ingest}'

+0

としてハイブスクリプト内でそれを使用します。私たちはサードパーティのUIを使用しています。なぜ2つの方法がパフォーマンスに大きな違いをもたらすのかまだ分かりません。 – DrV

+0

両方のクエリの計画を説明し、計画を比較すればわかります。 – leftjoin

+0

私がしたいのは、Hiveの日付関数を使用して、毎日クエリを実行するようにスケジューリングできるようにすることです(クエリの2番目のバージョン)。しかし、現時点では、クエリには時間がかかりすぎています。まるでテーブル全体を読んでいるかのようです。バグか、何か間違っているようです。 Hiveの日付関数を使用するか、ハードコーディングされた文字列を使用するかは、大きな違いがありますか? – DrV

関連する問題