Улей Query обращается к одному и тому же представлению несколько раз, любой оптимальный способ подойти к этому запросу - PullRequest
1 голос
/ 08 марта 2019

Мы поддерживаем приложение, которое выполняет огромные запросы кустов, запускаемые с помощью инструмента ETL.

Запрос после отображения выполняется в кусте. Запрос очень большой, но его структура выглядит следующим образом.

INSERT INTO Table2
Select t1.f0, t1.f1,
infUDFCallDouble('TO_FLOAT', t1.f2) as f2, 
SUBSTR(SUBSTR(toString(t1.f4, 'YYYY-MM-DD'), (CASE WHEN 0 < (- 
LENGTH(toString(t1.f4, 'YYYY-MM-DD'))) THEN 0 ELSE 0 END), 10), (CASE WHEN 0 < (- LENGTH(SUBSTR(toString(t1.f4, 'YYYY-MM-DD'), (CASE WHEN 0 < (- LENGTH(toString(t1.f4, 'YYYY-MM-DD'))) THEN 0 ELSE 0 END), 10))) THEN 0 ELSE 0 END), 10) as f4, 
f5, .....
FROM
   (
     Select t1.f0, t1.f1...
     FROM
        (
         SELECT CAST(t1.cust_id AS STRING) as f0, ....
          ...
         FROM sw.v_cust_info_pr t1
         )
     group by t1.f0, t1.f1
     .....t1.f50 )
t1 ; 

Я, конечно, не думаю, что они должны сканировать один и тот же вид несколько раз Есть ли более простой способ написать это. Или, конечно, многоуровневое картирование может быть объединено, это мое предположение. кроме этого, есть ли какой-нибудь другой более простой способ приблизиться к тому же самому. Я новичок и на стороне поддержки, но этот запрос выполняется в течение нескольких часов, поэтому нужно проверить, работает ли он правильно. я уверен, что один внутренний выбор может быть отброшен, все остальное я могу попробовать.

1 Ответ

0 голосов
/ 08 марта 2019

Подобные подзапросы в вашем вопросе не являются проблемой, об этом позаботится оптимизатор.Не будет многократных чтений одних и тех же данных.Ваш запрос читает источник только один раз: FROM sw.v_cust_info_pr t1.Весь запрос будет выполнен в двух вершинах - Mapper 1 и Reducer 2. Используйте объяснение, выберите , чтобы проверить это.Чтобы ускорить обработку, используйте Tez, CBO, векторизацию, PPD, настройте правильный параллелизм на картографических и редукторных устройствах .Использовать агрегацию на стороне карты set hive.map.aggr = true;

...