2016-12-08 3 views
0

У меня есть таблица транзакций 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), поскольку мы используем сторонний интерфейс.

ответ

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" 

Затем использовать его внутри улья сценария, как WHERE file_date ='${hiveconf:date_ingest}'

+0

К сожалению, мы не имеем доступа к командной строке Unix. Мы используем сторонний интерфейс. Все еще не уверен, почему эти два метода сильно влияют на производительность. – DrV

+0

Объясните план для обоих запросов и сравните планы, и вы узнаете. – leftjoin

+0

То, что я хотел бы сделать, это использовать функции даты улья, чтобы я мог планировать запрос каждый день для запуска (вторая версия запроса). Но на данный момент запрос занимает слишком много времени. Это как если бы он читал всю таблицу. Кажется, что есть либо ошибка, либо я делаю что-то неправильно. Почему это должно иметь такое огромное значение, использую ли я функции даты или времени жесткой кодировки? – DrV