更新时间:2022-12-14 GMT+08:00

使用Hive CBO优化查询

操作场景

在Hive中执行多表Join时,Hive支持开启CBO(Cost Based Optimization),系统会自动根据表的统计信息,例如数据量、文件数等,选出最优计划提高多表Join的效率。Hive需要先收集表的统计信息后才能使CBO正确的优化。

  • CBO优化器会基于统计信息和查询条件,尽可能地使join顺序达到最优。但是也可能存在特殊情况导致join顺序调整不准确。例如数据存在倾斜,以及查询条件值在表中不存在等场景,可能调整出非优化的join顺序。
  • 开启列统计信息自动收集时,需要在reduce侧做聚合统计。对于没有reduce阶段的insert任务,将会多出reduce阶段,用于收集统计信息。

前提条件

已登录Hive客户端,具体操作请参见使用Hive客户端

操作步骤

  1. 在Manager界面Hive组件的配置中搜索“hive.cbo.enable”参数,选中“true”永久开启功能。
  2. 手动收集Hive表已有数据的统计信息。

    执行以下命令,可以手动收集统计信息。仅支持统计一张表,如果需要统计不同的表需重复执行。

    ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]

    COMPUTE STATISTICS

    [FOR COLUMNS]

    [NOSCAN];

    • 指定FOR COLUMNS时,收集列级别的统计信息。
    • 指定NOSCAN时,将只统计文件大小和个数,不扫描具体文件。

    例如:

    analyze table table_name compute statistics;

    analyze table table_name compute statistics for columns;

  3. 配置Hive自动收集统计信息。开启配置后,执行insert overwrite/into命令插入数据时才自动统计新数据的信息。

    • 在Hive客户端执行以下命令临时开启收集:

      set hive.stats.autogather = true;开启表/分区级别的统计信息自动收集。

      set hive.stats.column.autogather = true; 开启列级别的统计信息自动收集。

      • 列级别统计信息的收集不支持复杂的数据类型,例如Map,Struct等。
      • 表级别统计信息的自动收集不支持Hive on HBase表。
    • 在Manager界面Hive的服务配置中,搜索参数“hive.stats.autogather”“hive.stats.column.autogather”,选中“true”永久开启收集功能。

  4. 执行以下命令可以查看统计信息。

    DESCRIBE FORMATTED table_name[.column_name] PARTITION partition_spec;

    例如:

    desc formatted table_name;

    desc formatted table_name.id;

    desc formatted table_name.id partition(time='2016-05-27');

    分区表仅支持分区级别的统计信息收集,因此分区表需要指定分区来查询统计信息。