查詢有時因轉換錯誤而失敗
我有一個查詢可以在同一個數據集上執行,有時會失敗,有時會成功
查詢是由 hive 元數據服務生成的,我無法修改。
這是查詢的簡化版本:
select "TBLS"."TBL_ID", "FILTER0"."PART_ID", "TBLS"."TBL_NAME", "FILTER0"."PART_KEY_VAL" from "PARTITIONS" inner join "TBLS" on "PARTITIONS"."TBL_ID" = "TBLS"."TBL_ID" and "TBLS"."TBL_NAME" = 'test_table_int' inner join "PARTITION_KEY_VALS" "FILTER0" on "FILTER0"."PART_ID" = "PARTITIONS"."PART_ID" where cast("FILTER0"."PART_KEY_VAL" as decimal(21, 0)) = 1
當我啟動一個新數據庫並填充相關表時,這就是整個數據的樣子(沒有任何過濾器的查詢):
並執行上面的查詢將返回一行(
PART_KEY_VAL
= 1 的那一行)在我執行一些寫入這些表的自動化測試後,問題就開始了。我找不到任何模式,我只是執行了一些寫入這些表的複雜測試
現在,如果我再次填充這些表,數據看起來很相似:
但執行上面的查詢將導致:
SQL 錯誤
$$ 22P02 $$:錯誤:數字類型的輸入語法無效:“c”
出於某種原因,值“c”被轉換為十進制並且它失敗了,即使對相同數據的相同查詢在早些時候工作
這種行為的原因可能是什麼?
作為參考,這裡是生成查詢的地方,但我在上面簡化了一點:https ://github.com/apache/hive/blob/rel/release-3.1.2/standalone-metastore/src/main/java /org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java#L1289-L1339
問題是由於某種原因 postgres 停止使用列“TBL_NAME”上的索引。
使用索引時,先對錶進行過濾,剩下的值都是int。
但是當不使用索引時,強制轉換將發生在所有行上,並且會在字元串上失敗。
作為一種解決方法,我設置了
enable_seqscan = false
, 並強制 postgres 使用索引,但這不是一個長期的解決方案。我在 hive 上打開了一個錯誤,對問題進行了更詳細的解釋: https ://issues.apache.org/jira/browse/HIVE-23576