У меня есть таблица транзакций table_A
, которая обновляется каждый день. Каждый день я вставляю новые данные в table_A
с внешнего table_B
с использованием поля 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}
;
Кто-нибудь испытал подобные проблемы? Вы должны предположить, что у меня нет доступа к команде улья Unix (т. Е. Не может использовать опции --hiveconf), поскольку мы используем сторонний интерфейс.
К сожалению, мы не имеем доступа к командной строке Unix. Мы используем сторонний интерфейс. Все еще не уверен, почему эти два метода сильно влияют на производительность. – DrV
Объясните план для обоих запросов и сравните планы, и вы узнаете. – leftjoin
То, что я хотел бы сделать, это использовать функции даты улья, чтобы я мог планировать запрос каждый день для запуска (вторая версия запроса). Но на данный момент запрос занимает слишком много времени. Это как если бы он читал всю таблицу. Кажется, что есть либо ошибка, либо я делаю что-то неправильно. Почему это должно иметь такое огромное значение, использую ли я функции даты или времени жесткой кодировки? – DrV