Как я могу справиться с перекосом данных в SQL на кусте? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть две таблицы, таблица netpack_busstop имеет 100 000 000, другая таблица ic_card_trade имеет 100 000. Мой SQL-запрос выглядит так:

    SELECT
        count(*)
    FROM
        ic_card_trade tmpic
    LEFT JOIN netpack_busstop tmpnp 
    ON tmpic.line_no = tmpnp.line_no
    AND tmpic.bus_no = tmpnp.bus_no

Я запускаю это задание на использование hasoop более 40 минут, онотак долго.

Я хочу быстро разобраться с ульем sql, тратить меньше времени. Я не знаю, как это сделать с помощью sql.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Вы можете перефразировать запрос:

select sum(ic.cnt * coalesce(nb.cnt, 1))
from (select line_no, bus_no, count(*) as cnt 
      from ic_card_trade ic
      group by line_no, bus_no
     ) ic left join
     (select line_no, bus_no, count(*) as cnt
      from netpack_busstop nb
      group by line_no, bus_no
     ) nb
     on ic.line_no = nb.line_no and
        ic.bus_no = nb.bus_no;

То есть сначала выполните агрегирование , а затем вычислите число полученных строк.

0 голосов
/ 26 сентября 2018

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

Я думаю, что rootпричина вашей низкой производительности - отсутствие индексов, и вот хорошая статья о том, как с этим справиться - Индексы и представления в улье .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...