performance - 为什么选择不同的分区列很慢?
问题描述
我有一张桌子zhihu_answer_increment
,它是按列分区的ym
。当我执行 queryselect 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作业,就我而言,仅检查分区目录就足以进行此查询。或者我的考虑太简单了。
解决方案
如果您可以使用 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"
推荐阅读
- android - 如何在 Flutter 中实现一个可以垂直和水平扩展并再次收缩的网格?
- java - 如何从 firebase 中检索值(一对多关系)?
- html - 条件菜单项着色
- html - 如果禁用 JavaScript,则显示背景图像
- python - 如何使用来自 Python 的用户输入的 UPDATE SQL 语句?
- javascript - 如何将项目添加到列表并从列表中删除项目?
- prolog - 如何编写仅将正数相加的序言程序?
- python - 如何在python中动态附加字典字典?
- flutter - 如果颤动中的键是数字,如何映射数据
- javascript - 如何连接 lib 目录中描述的模块?