Медленный запрос улья, почему (левое полусоединение)?

Мой запрос улья зависает, и я не знаю почему (с использованием hadoop 0.20.1, улья 0.9).

Запрос:

SELECT 
   a.field1 FROM table_1 a 
LEFT SEMI JOIN 
   (SELECT DISTINCT(usrId) FROM table_2 b 
       WHERE soemthing=true ORDER BY rand() limit 1000) random_user_ids 
WHERE a.usrId=random_user_ids.usrId

EXPLAIN возвращает мне:

STAGE DEPENDENCIES:
  Stage-1 is a root stage
  Stage-2 depends on stages: Stage-1
  Stage-3 depends on stages: Stage-2
  Stage-0 is a root stage

Набор данных

  • ~ 200M записей внутри таблицы
  • отношение table_1.usrId к table_1 должно быть примерно 1:40, т.е. 1000 * 40 = 40000 должно быть возвращено в приведенном выше запросе

Наблюдения:

  • Задание зависает на последнем этапе 3 на уровне 33% (сокращение> сортировка), где происходит соединение (результат соединения составляет около 40000)
  • Помимо того, что это медленно, почему сокращение> сортировка вообще является частью этапа-3? Он должен только присоединяться к вещам, а не ЗАКАЗАТЬ ничего
  • размер редуктора всего 1 (из-за сортировки?), что почти всегда плохо, поскольку он не масштабируется.

Если вам нужен дополнительный ввод (например, более подробная информация EXPLAIN, дополнительная информация о кластере), просто сообщите.

Спасибо!


person manuel aldana    schedule 11.07.2013    source источник


Ответы (1)


Условие JOIN следует включать в предложение ON, а не в предложение WHERE.

Пример синтаксиса:

SELECT a.key, a.val
FROM a LEFT SEMI JOIN b ON (a.key = b.key)
person cabad    schedule 11.07.2013
comment
aargh, ON, который сделал уловку. все еще с "WHERE" загадка, почему оператор сокращения был отсортирован на этапе 3, не может увидеть его с планом EXPLAIN. - person manuel aldana; 11.07.2013