【问题标题】:Why select distinct partitioned column is very slow?为什么选择不同的分区列很慢?
【发布时间】:2019-10-15 03:46:39
【问题描述】:

我有一张表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作业,就我而言,仅检查分区目录就足以进行此查询。或者我的考虑太简单了。

【问题讨论】:

    标签: performance hive query-optimization hive-partitions


    【解决方案1】:

    如果您可以使用 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"
    

    【讨论】:

    • 非常感谢您的回答。 SQL模式有什么解决办法吗?在我的场景中,在 shell 中运行并不方便。
    • @DennisLi 我遇到了同样的问题,找不到 SQL 解决方案。使用 Hive 1.2 我尝试使用仅获取任务,但不幸的是它不适用于 distinct
    • 好的,我试试看。谢谢@leftjoin。
    猜你喜欢
    • 2022-01-18
    • 2014-12-02
    • 1970-01-01
    • 2011-03-30
    • 2021-10-31
    • 1970-01-01
    • 2010-10-21
    • 2023-03-12
    • 2021-12-15
    相关资源
    最近更新 更多