我有一个查询可以在同一个数据集上运行,有时会失败,有时会成功
查询是由 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