У меня есть следующие (очень простой) Улей запрос:Оптимизация Hive GROUP BY, когда строки сортируются
select user_id, event_id, min(time) as start, max(time) as end,
count(*) as total, count(interaction == 1) as clicks
from events_all
group by user_id, event_id;
Таблица имеет следующую структуру:
user_id event_id time interaction
Ex833Lli36nxTvGTA1Dv juCUv6EnkVundBHSBzQevw 1430481530295 0
Ex833Lli36nxTvGTA1Dv juCUv6EnkVundBHSBzQevw 1430481530295 1
n0w4uQhOuXymj5jLaCMQ G+Oj6J9Q1nI1tuosq2ZM/g 1430512179696 0
n0w4uQhOuXymj5jLaCMQ G+Oj6J9Q1nI1tuosq2ZM/g 1430512217124 0
n0w4uQhOuXymj5jLaCMQ mqf38Xd6CAQtuvuKc5NlWQ 1430512179696 1
Я знаю, за то, что строки сначала сортируются по user_id
, а затем по event_id
.
Вопрос: есть ли способ «намекнуть» движку «Улей» на оптимизацию запроса при сортировке строк? Цель оптимизации - избегать хранения всех групп в памяти, поскольку она необходима только для сохранения одной группы за раз.
Прямо сейчас этот запрос, запущенный в 6-узловой кластер Hadoop с пропускной способностью 16 ГБ, содержит примерно 300 ГБ данных, занимает около 30 минут и использует большую часть ОЗУ, задыхаясь от системы. Я знаю, что каждая группа будет маленькой, не более 100 строк на кортеж (user_id, event_id)
, поэтому я думаю, что оптимизированное выполнение, вероятно, будет иметь очень небольшой объем памяти, а также быть быстрее (так как нет необходимости замыкать групповые ключи).
В качестве побочного примечания 'count (взаимодействие == 1)' работает не так, как я ожидал, считая только строки, которые имеют 1, но вместо этого возвращает то же самое, что и 'count (*)'. –
Да. Агрегативные функции, включая COUNT, игнорировать (только) значения NULL и FALSE не являются NULL –