我有一亿两千万条记录在Hive表里。执行时 select 声明中有一些 where 条件或执行任何 avg , max(mathematical operation) 查询正在执行,需要2到3个小时。我是否缺少一些配置。因为查询花费这么多时间似乎很不寻常。我正在microsoft azure服务上使用hortonworks 2.5沙盒。请给出解决方案。谢谢您。
select
where
avg
max(mathematical operation)
epfja78i1#
有许多方法可以优化查询,但根据数据集记录,这可能对您有所帮助。根据我的理解和实践,我在这里强调了几点:1:use tez hive可以使用apache tez执行引擎,而不是古老的map reduce引擎。我想提出一个简单的建议:如果在您的环境中默认情况下没有启用,请使用tez,在您的配置单元查询的开头将以下内容设置为“true”:
set hive.execution.engine=tez;
通过上述设置,您执行的每个配置单元查询都将利用tez。2:使用文件hive支持orcfile,这是一种新的表存储格式,支持通过 predicate 下推、压缩等技术提高速度。3:使用矢量化矢量化查询执行提高了扫描、聚合、筛选和联接等操作的性能,方法是一次执行1024行,而不是每次执行一行。此功能在hive 0.13中引入,可显著缩短查询执行时间,并通过两个参数设置轻松启用:
set hive.vectorized.execution.enabled = true;set hive.vectorized.execution.reduce.enabled = true;
set hive.vectorized.execution.enabled = true;
set hive.vectorized.execution.reduce.enabled = true;
4:基于成本的查询优化最近添加到配置单元中的一个基于成本的优化根据查询成本执行进一步的优化,从而产生可能不同的决策:如何排序联接、执行哪种联接类型、并行度等。要使用基于成本的优化(也称为cbo),请在查询的开头设置以下参数:
set hive.cbo.enable=true;set hive.compute.query.using.stats=true;set hive.stats.fetch.column.stats=true;set hive.stats.fetch.partition.stats=true;
set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;
5:写好sqlsql是一种强大的声明性语言。与其他声明性语言一样,编写sql语句的方法不止一种。尽管每个语句的功能是相同的,但它可能具有显著不同的性能特征。
1条答案
按热度按时间epfja78i1#
有许多方法可以优化查询,但根据数据集记录,这可能对您有所帮助。根据我的理解和实践,我在这里强调了几点:
1:use tez hive可以使用apache tez执行引擎,而不是古老的map reduce引擎。我想提出一个简单的建议:如果在您的环境中默认情况下没有启用,请使用tez,在您的配置单元查询的开头将以下内容设置为“true”:
通过上述设置,您执行的每个配置单元查询都将利用tez。
2:使用文件
hive支持orcfile,这是一种新的表存储格式,支持通过 predicate 下推、压缩等技术提高速度。
3:使用矢量化
矢量化查询执行提高了扫描、聚合、筛选和联接等操作的性能,方法是一次执行1024行,而不是每次执行一行。
此功能在hive 0.13中引入,可显著缩短查询执行时间,并通过两个参数设置轻松启用:
4:基于成本的查询优化
最近添加到配置单元中的一个基于成本的优化根据查询成本执行进一步的优化,从而产生可能不同的决策:如何排序联接、执行哪种联接类型、并行度等。
要使用基于成本的优化(也称为cbo),请在查询的开头设置以下参数:
5:写好sql
sql是一种强大的声明性语言。与其他声明性语言一样,编写sql语句的方法不止一种。尽管每个语句的功能是相同的,但它可能具有显著不同的性能特征。