繁体   English   中英

Hive 查询优化

[英]Hive query optimisation

当源数据文件附加新记录时,必须每天从 hive 中的外部表执行增量加载到内部表中。 可以根据加载新记录的时间戳(表中的列load_ts )过滤掉新记录。 尝试通过从源表中选择 load_ts 大于目标表中当前max(load_ts)的记录来实现这一点,如下所示:

INSERT INTO TABLE target_temp PARTITION (DATA_DT)
SELECT ms.* FROM temp_db.source_temp ms 
JOIN (select max(load_ts) max_load_ts from target_temp) mt
ON 1=1
WHERE
ms.load_ts > mt.max_load_ts;

但是上面的查询没有给出所需的输出。 执行需要很长时间( Map-Reduce 范式不应该是这种情况)。

尝试了其他场景,比如将max(load_ts)作为变量传递,而不是加入。 性能仍然没有改善。 如果任何人都可以就这种方法中可能不正确的内容以及任何替代解决方案发表见解,那将非常有帮助。

首先,map/reduce 模型并不能保证您的查询花费更少。 主要思想是它的性能将随着节点数量线性扩展,但您仍然必须考虑如何做事,比在普通 SQL 中更多。

首先要检查表是否按时间分区。 如果没有,它应该就像您每次都阅读整个表格一样。 其次,您每次也在整个目标表上计算最大值。 如果你只计算最后一个分区的最大值,你可以让它更快,所以改变这个

JOIN (select max(load_ts) max_load_ts from target_temp) mt

对此(你没有写分区列,所以我假设它被称为“dt”

JOIN (select max(load_ts) max_load_ts from target_temp WHERE dt=PREVIOUS_DATA_DT) mt

因为我们知道最大 load_ts 将在最后一个分区中。

否则,如果不知道源表的结构,以及两个表的大小,就像其他人评论的那样,很难提供帮助。

JOIN 比 WHERE 子句中的变量慢。 但是这里的主要性能问题是您的查询执行目标表和源表的完整扫描。 我会推荐:

  1. 仅查询 max(load_ts) 的最新分区。
  2. 启用统计信息收集和使用

    set hive.compute.query.using.stats=true; set hive.stats.fetch.column.stats=true; set hive.stats.fetch.partition.stats=true; set hive.stats.autogather=true;

计算两个表的列的统计信息。 统计信息将使诸如选择 MAX(partition) 或 max(ts) 之类的查询执行得更快

  1. 如果适用,尝试将源分区文件放入目标分区文件夹而不是 INSERT(目标和源表分区和存储格式应启用此功能)。 例如对于文本文件存储格式,如果源表分区仅包含行>max(target_partition),它就可以正常工作。 您可以结合使用复制文件方法(对于那些完全包含要插入而无需过滤的行的源分区)和 INSERT(对于包含需要过滤的混合数据的分区)。

  2. Hive 可能会在 INSERT 期间合并您的文件。 此合并阶段需要额外的时间并添加额外的阶段作业。 检查 hive.merge.mapredfiles 选项并尝试将其关闭。

  3. 当然,使用预先计算的变量而不是连接。

通过启用以下属性来使用基于成本的优化技术

set hive.cbo.enable=true;
set hive.stats.autogather=true;
set hive.stats.fetch.column.stats=true;
set hive.compute.query.using.stats=true;
set hive.vectorized.execution.enabled=true;
set hive.exec.parallel=true;

还分析表

ANALYZE TABLE temp_db.source_temp COMPUTE STATISTICS [comma_separated_column_list];
ANALYZE TABLE target_temp PARTITION(DATA_DT) COMPUTE STATISTICS;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM