我在 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 中創建表
CREATE TABLE
sample(fnamestring,snamestring,sidstring) ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 存盤為 INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive .ql.io.HiveIgnoreKeyTextOutputFormat' TBLPROPERTIES ('transient_lastDdlTime'='1616020251');
2)在表中插入一些記錄以下值
插入樣本值(“PQ”、“F”、“33”);
插入樣本值(“RK”、“A”、“11”);
插入樣本值(“AZ”、“B”、“22”);
3) 查表
從樣本中選擇 *;
PQ F 33
RK A 11
AZ B 22
4) 運行以下查詢。它應該給出 0 條記錄,而不是給出所有記錄
從樣本中選擇 fname,其中 sid in ('11') 和 sid in ('22');
PQ
RK
AZ
5) 當我們在 Hive 中禁用 cbo 時結果很好
設定 hive.cbo.enable=false;
從樣本中選擇 fname,其中 sid in ('11') 和 sid in ('22');
OK 耗時:0.131 秒
uj5u.com熱心網友回復:
錯誤的結果來自 HivePointLookupOptimizerRule [1] 中的錯誤簡化。這對應于在 >= 3.2.0 版本中修復的 HIVE-21685 [2] 下記錄的錯誤。
作為一種解決方法,您可以通過將相應的屬性設定為 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
uj5u.com熱心網友回復:
資料型別是 String 使用 INT
最簡單的解決方案是不使用 CBO,問題仍然存在,但如果您仍想使用,請在更改資料型別后檢查這些內容
1.Privilages 2.Version control 3.auto tune
uj5u.com熱心網友回復:
在查詢中使用以選擇多個專案
從 sid in ('11','22') 的樣本中選擇 fname;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/473775.html
下一篇:沒有打開桌面會話的Selenium4.1.3/IEDriverServer4.0.0的SessionNotCreatedException(適用于Selenium3.141.0/IEDriverSer
