Оптимизация Hive Query с UNION ALL и RANK с заказом - PullRequest
0 голосов
/ 04 апреля 2019

Текущий сценарий: У меня есть этот запрос, который объединяет все два набора данных и затем выбирает поля на основе ранга. Но, согласно моему анализу, весь набор данных может быть удален с одной стороныUNION

Анализ: Итак, если вы посмотрите на приведенный ниже запрос - я думаю, мы можем полностью игнорировать и удалить набор данных, который генерируется объединениями таблиц: P, Q, R, S и T

также можно заменить unionall на union здесь

Запрос:

SELECT OUTERV.f1, ... OUTERV.f30
FROM 
      (
        SELECT 
          unionV.f1, ...unionV.f30, ROW_NUMBER() over (PARTITION BY unionV.ifc order by  unionV.orderNUM_ asc) rank_
        FROM 
          (
            SELECT f1 .. few fields, 1 as ORDERNUM_ 
            FROM 
            A 
            JOIN B on A.id = B.id 
            JOIN ( SELECT few remaining fields FROM C )  
            C ON C.id = B.id
            JOIN D ON C.id = D.id
            JOIN E ON E.id = D.id
            JOIN F on F.id = E.id
            UNION ALL 
            SELECT 
              f1, f2, ...f30 , 2 as ORDERNUM_ 
            FROM 
            P 
            JOIN Q ON P.id = Q.id
            JOIN R ON Q.id = R.id
            JOIN S on S.id = R.id
            JOIN T on S.id = T.id

          )unionV
      ) 
OUTERV where 
OUTERV.rank_ = 1

Запрос: Пожалуйстаподтвердите, если мой анализ правильный.

1 Ответ

1 голос
/ 04 апреля 2019

Я не согласен с анализом; это делает предположения, которые не могут быть правдой. Однако если вы можете гарантировать, что все значения IFC во второй части объединения существуют в первой части объединения, и это ВСЕГДА так, тогда ваш анализ верен.

По сути, ваш запрос - это доверие к данным из Первый набор объединения больше, чем второй набор объединения. Однако, если есть значение IFC во втором наборе, а не в первом; оно должно исходить от второй части союза; таким образом удаление второй части объединения может удалить записи.

Пример:

  • Предположим, что unionV.ifc получен из таблиц A и P на каждой стороне объединения
  • Допустим, следующие данные в A & P

.

A.ifc
A
B

P.ifc
A
Z

В вашем текущем запросе результаты будут

A (from A table)
B (from A table)
Z (from P Table)  

Если вы исключите 2-ю часть объединения, вы исключите P и, следовательно, Z будет исключен из результатов; следовательно, они не равны, и вы не можете удалить 2-ю часть объединения.

Теперь, если все ifc, определенные во втором наборе, содержатся в первом наборе, определенном объединениями, и это ВСЕГДА true; тогда да, вы можете устранить 2-ю часть союза. Так как первый набор содержит полный набор, в первую очередь. Однако, если это не гарантированное истинное утверждение, тогда текущий подход, использующий объединение по a ... F и P ... T, генерирует «главный набор»

...