如何比较具有不同数据类型组的两列

时间:2019-10-04 17:05:05

标签: sql hadoop hive cloudera hive-metastore

这是我昨天提出的问题的扩展: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?例如,如果:

  1. Column1是BIGINT
  2. 第2列为STRING

然后将CAST Column2作为BIGINT,然后执行比较。需要最简单的解决方案。我希望不必对正在生成SELECT语句的基础系统进行实质性的代码更改。

更新2: 有一个后端系统生成SQOOP查询,并且在该系统中有一个函数可以修改SELECT子句以比较两列。我们遇到的问题是,这些列曾经在我们运行的早期版本的HIVE / Cloudera上隐式转换。现在,我们要升级到不支持隐式数据类型转换的版本,我们需要找到最简单的解决方案以继续支持数据类型转换。不幸的是,后端没有可用的元数据,因此我试图在SELECT子句中破解它

1 个答案:

答案 0 :(得分:1)

隐式广播是个好主意:

CASE 
    WHEN  Column1 <=> cast(Column2 as bigint) THEN 0 
    ELSE 1
END

如果无法进行强制转换,则强制转换的结果为NULL。