#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. да, . я также начну параллельно просматривать данные . спасибо за пример, это действительно помогло.