Почему выделенный разделенный столбец очень медленный? - PullRequest
1 голос
/ 15 октября 2019

У меня есть таблица zhihu_answer_increment, она была разбита на столбец ym. Когда я выполняю запрос select distinct(ym) from zhihu.zhihu_answer_increment;, это заняло более 1 минуты. Во время процесса улей запустил работу по уменьшению карты. вот журнал:

INFO  : MapReduce Jobs Launched: 
INFO  : Stage-Stage-1: Map: 1  Reduce: 1   Cumulative CPU: 3.59 sec   HDFS Read: 14969 HDFS Write: 106 HDFS EC Read: 0 SUCCESS
INFO  : Total MapReduce CPU Time Spent: 3 seconds 590 msec
INFO  : Completed executing command(queryId=hive_20191015113300_a6f58bad-f35b-4243-890a-a0d9ba9a5210); Time taken: 95.048 seconds
INFO  : OK

Для сравнения, show partitions zhihu_answer_increment; возвращает результат намного быстрее (всего за несколько секунд). Но мне нужно взять select distinct(ym) from zhihu.zhihu_answer_increment в качестве подзапроса.

Так как я могу оптимизировать этот запрос? и я не понимаю, почему он запустил задание mapreduce, насколько мне известно, для этого достаточно только проверки каталога разделов. Или, может быть, мое соображение слишком простое.

Я благодарен за вашу помощь. Спасибо.

1 Ответ

2 голосов
/ 15 октября 2019

Если вы можете использовать shell, то получите список разделов в переменную, используя SHOW PARTITIONS (работает быстро), и преобразуйте его в список через запятую, используя AWK. Затем параметризовать ваш скрипт улья, используя переменную с partition_list:

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

partition_list=$(hive -S -e "show partitions your_table;"  |  awk -vq="'" -F "=" 'f&&!NF{exit}{f=1}f{printf c q $2 q}{c=","}')


hive -e "select 1 from your_table where partition_column in (${partition_list}) limit 1"
...