蜂巢 CBO。在 where 子句中使用 MULTIPLE IN 条件的 Hive SQL 查询的错误结果

HIVE CBO. Wrong results with Hive SQL query with MULTIPLE IN conditions in where clause

我是 运行 Hive 中的一个 SQL 查询,它在启用和禁用 CBO 时给出不同的结果。启用 CBO 时结果错误(设置 hive.cbo.enable=true;)。

先决条件: 安装了 Apache Hadoop 2.10.1 + Apache Hive 2.3.6。 (我尝试使用 Apache Hive 3+ 版本和 Hadoop 3+ 版本重现该问题,它们工作正常。)

重现操作:

1) 在 Hive

中创建 table

CREATE TABLE sample( fname string, sname string, sid string) ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' TBLPROPERTIES ( 'transient_lastDdlTime'='1616020251');

2) 在table下面的值

中插入一些记录

insert into sample values ("PQ", "F", "33");

insert into sample values ("RK", "A", "11");

insert into sample values ("AZ", "B", "22");

3) 检查 table

select * from sample;

PQ F 33
RK A 11
AZ B 22

4) 运行 下面的查询。它应该给出 0 条记录,而不是给出所有记录

select fname from sample where sid in ('11') and sid in ('22');

PQ
RK
AZ

5) 当我们在 Hive 中禁用 cbo 时,结果很好

set hive.cbo.enable=false;

select fname from sample where sid in ('11') and sid in ('22');

好的 耗时:0.131 秒

数据类型为 String 使用 INT

最简单的解决方案是不使用 CBO,问题仍然存在,但如果您仍想使用,请在更改数据类型后检查这些内容

1.Privilages 2.Version控制 3.auto 已调优

在查询中使用 select 多个项目

select fname from sample where sid in ('11','22');

错误的结果来自 HivePointLookupOptimizerRule [1] 中的错误简化。这对应于 HIVE-21685 [2] 下记录的错误,该错误已在版本 >= 3.2.0.

中修复

作为解决方法,您可以通过将相应的 属性 设置为 false 来禁用相应的规则。

set hive.optimize.point.lookup=false

[1] https://github.com/apache/hive/blob/62834fbdd3bd4065413b59448759c6a25aa1dbf0/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HivePointLookupOptimizerRule.java

[2] https://issues.apache.org/jira/browse/HIVE-21685