私は毎日更新される取引テーブル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オプションを使用できない)と仮定する必要があります。
としてハイブスクリプト内でそれを使用します。私たちはサードパーティのUIを使用しています。なぜ2つの方法がパフォーマンスに大きな違いをもたらすのかまだ分かりません。 – DrV
両方のクエリの計画を説明し、計画を比較すればわかります。 – leftjoin
私がしたいのは、Hiveの日付関数を使用して、毎日クエリを実行するようにスケジューリングできるようにすることです(クエリの2番目のバージョン)。しかし、現時点では、クエリには時間がかかりすぎています。まるでテーブル全体を読んでいるかのようです。バグか、何か間違っているようです。 Hiveの日付関数を使用するか、ハードコーディングされた文字列を使用するかは、大きな違いがありますか? – DrV