这是我昨天提出的问题的扩展:How to handle potential data loss when performing comparisons across data types in different groups
在HIVE中,是否可以在SELECT
子句内联的不同数据类型组中的两个列之间执行比较?我首先需要确定每列的传入元数据是什么,然后提供选择要使用的CAST
的逻辑。
CASE
WHEN Column1 <=> Column2 THEN 0 -- Error occurs here if data types are in different data type groups (i.e., BIGINT <=> STRING)
ELSE 1
END
如果这不可能,是否有一种变通方法来检索元数据并根据某些规则执行CAST?例如,如果:
然后将CAST Column2作为BIGINT,然后执行比较。需要最简单的解决方案。我希望不必对正在生成SELECT
语句的基础系统进行实质性的代码更改。
更新2:
有一个后端系统生成SQOOP查询,并且在该系统中有一个函数可以修改SELECT子句以比较两列。我们遇到的问题是,这些列曾经在我们运行的早期版本的HIVE / Cloudera上隐式转换。现在,我们要升级到不支持隐式数据类型转换的版本,我们需要找到最简单的解决方案以继续支持数据类型转换。不幸的是,后端没有可用的元数据,因此我试图在SELECT
子句中破解它
答案 0 :(得分:1)
隐式广播是个好主意:
CASE
WHEN Column1 <=> cast(Column2 as bigint) THEN 0
ELSE 1
END
如果无法进行强制转换,则强制转换的结果为NULL。