hive explain怎么看出是否全表扫描?

explain Select A .col1, A .col2, A .col3 From A _ table A
left semi join B _ table B on A . id = b . id
Where A . rq =2020-01-01;

rq是分区字段

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案: 可以通过以下步骤来判断Hive查询是否进行了全表扫描:

    1. 在Hive中执行查询语句:
    SELECT * FROM table_name WHERE rq='2020-01-01';
    

    其中,table_name为需要查询的表名,rq为分区字段。

    1. 使用explain语句获取查询的执行计划:
    EXPLAIN SELECT * FROM table_name WHERE rq='2020-01-01';
    
    1. 查看查询计划中的Scan Operator信息:
    |    TableScan [TS_0] (rows=XXX width=XXX)
    |        default@table_name,table_name,Tbl:COMPLETE,Col:COMPLETE,Output:["xxxx","xxxx","xxxx","xxxxxx","xxxxx","xxxxxx","xxxxx"]
    

    其中,rows表示该操作扫描表的行数,若rows=表总行数,则说明进行了全表扫描。

    1. 可以结合hive.mapred.mode参数来判断是否进行了全表扫描:

    若hive.mapred.mode=strict,则只有进行了分区限制或使用索引等情况下,才不会进行全表扫描。

    若hive.mapred.mode=nonstrict,则Hive会尝试在分区限制和索引等操作无效的情况下,避免全表扫描。若查询计划中的Scan Operator部分没有进行分区限制或使用索引等操作,且hive.mapred.mode=nonstrict,则说明进行了全表扫描。

    1. 综合考虑以上信息,结合实际情况来判断查询是否进行了全表扫描。

    如果以上操作不能有效判定是否进行全表扫描,则可以考虑使用Hive性能监测工具(Apache Ambari、Cloudera Manager等)或其他第三方工具来进行分析优化。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^