Оптимизация запроса улья с ОБЪЕДИНЕНИЕМ ВСЕХ и РАНЖИРОВАНИЕМ по порядку

#sql #hadoop #hive #query-optimization #hiveql

#sql #hadoop #улей #оптимизация запроса #hiveql

Вопрос:

Текущий сценарий: у меня есть этот запрос, который выполняет объединение всех для двух наборов данных, а затем выбирает поля на основе ранга, но, согласно моему анализу, весь набор данных может быть удален с одной стороны ОБЪЕДИНЕНИЯ

Анализ: Итак, если вы посмотрите на приведенный ниже запрос — я думаю, мы можем полностью игнорировать и удалять набор данных, который генерируется объединениями таблиц: 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:

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

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

Пример:

  • Предположим, что unionV.ifc получен из таблиц A и P с каждой стороны объединения
  • Предположим, что следующие данные в A amp; 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, определенные во втором наборе, содержатся в первом наборе, определенном объединениями, и это ВСЕГДА верно; тогда да, вы могли бы исключить 2-ю часть объединения. Поскольку первый набор содержит полный набор в первую очередь. Однако, если это не является гарантированно истинным утверждением, то текущий подход, использующий объединение для a … F и P … T, генерирует «Основной набор»

Комментарии:

1. да . теперь я понял, что вы говорите. большое, большое спасибо за ваше подробное объяснение. В этом случае ОБЪЕДИНЕНИЕ также увеличит время выполнения, объединение-все имеет больше смысла. теперь этот запрос выглядит в значительной степени настроенным, без возможности оптимизации.

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

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