为什么选择不同的分区列非常慢?

6fe3ivhb  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(248)

我有一张table zhihu_answer_increment ,它是按列划分的 ym . 当我执行查询时 select distinct(ym) from zhihu.zhihu_answer_increment; ,耗时1分钟。在此过程中,hive启动了map reduce作业。日志如下:

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作业,就我而言,只检查分区目录就足够了。或者我的考虑太简单了。

ejk8hzay

ejk8hzay1#

如果可以使用shell,那么可以使用show partitions(工作速度很快)将分区列表转换为变量,并使用awk将其转换为逗号分隔的列表。然后使用带有分区列表的变量参数化配置单元脚本:
像这样:

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"

相关问题