1

这是我昨天提出的一个问题的延伸:如何在对不同组中的数据类型进行比较时处理潜在的数据丢失

在 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'ing?例如,如果:

  1. Column1 是 BIGINT
  2. 第 2 列是字符串

然后将 Column2 转换为 BIGINT,然后执行比较。需要尽可能简单的解决方案。我希望不必对生成SELECT语句的底层系统进行大量代码更改。

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

4

1 回答 1

1

隐式转换是个好主意:

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

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

于 2019-10-04T17:47:12.567 回答