Как сделать эффект разделами в Hive - PullRequest
0 голосов
/ 31 августа 2018

Я использую Hive на MRv2 и пытаюсь оптимизировать запросы улья.

База данных предполагает историю покупок в магазине у дома. Эта база данных содержит 6 таблиц (клиенты (1M строк), магазины (1K строк), сотрудники (5K строк), жанры (30 строк), элементы (3.5K строк), purchase_histories (1G строк)), и я сделал запрос, который получает сумма номера, приобретенного для каждого товара, жанра и пола клиента.

SELECT c.gender, 
       g.name, 
       i.name, 
       Sum(ph.num) 
FROM   purchase_histories ph 
       JOIN customers c 
         ON ( c.id = ph.cus_id 
              AND ph.dt < $var1
              AND ph.dt > $var2 ) 
       JOIN items i 
         ON ( i.id = ph.item_id ) 
       JOIN genres g 
         ON ( g.id = i.gen_id ) 
GROUP  BY c.gender, 
          g.name, 
          i.name; 

Я сделал раздел purchase_histories (dt), items (gen_id) и клиенты (пол, год).

Я сравнил эту базу данных и не базу данных разделов (содержит те же таблицы) по вышеуказанному запросу. Я ввел некоторые виды значений в $ var1 и $ var2, чтобы ссылочные номера строк purchase_histories стали 10 000 000.

Я измерил время процесса и обнаружил, что база данных без разделов быстрее (или равная), чем другая. Я проверил журналы выполнения и обнаружил, что число картографов многораздельной базы данных составляет около 10-30, а не разделенных баз данных - около 150. Я не думаю, что многие картографы определенно хороши, но 10-30 картографов слишком малы. Поэтому я подумал, что мне нужно проверить некоторые настройки относительно номеров карт или объема памяти. Но я не знаю, какую конфигурацию изменить, и моя мысль верна.

Результатом EXPLAIN являются no_partitions и partitioning . И журналы выполнения: exe_log_no_partition и exe_log_partitioned .

Спасибо.

Добавление

1, я увидел EXPLAIN результат разбиения на части и подумал, что число картографов рассчитывается по формуле ниже:

(the table size 2619958583)/(mapreduce.input.fileinputformat.split.maxsize=256000000)

Это неправильно?

...