Hive CASE语句中的数据类型转换错误

时间:2013-03-18 19:29:48

标签: hive hiveql

我的HiveQL查询类似于:

SELECT  ID, 
        CASE WHEN col_a = 0 THEN 0
        ELSE (col_b / col_a) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

当我在Hive中执行此操作时,我最近开始收到错误FAILED: Error in semantic analysis: Line X:Y ArgumentTypeMismatch 'col_a': The expression after ELSE should have the same type as those after THEN: "int" is expected but "double" is found.

虽然我知道文字0(col_a / col_b)的结果之间存在数据类型不匹配,但我不清楚为什么Hive会对此感到窒息,更重要的是,最好的课程是什么行动是解决此错误。我应该将文字0投射为double还是有更好的方法?

这是在Amazon EMR中运行的Hive 0.8.1。

1 个答案:

答案 0 :(得分:7)

假设col_a和col_b都是ints,这是一种奇怪的行为。文字0当然是int,根据wiki tutorial除法“给出了将B除以A的结果。结果的类型与普通父母相同(在操作数类型的类型层次结构。如果操作数是整数类型,则结果是除法的商“所以它也应该是int

我正在运行Hive 0.10.0并得到与您相同的错误,(col_b / col_a)看起来像double,但应该是int。对我来说这看起来像个错误,但也许在我没有找到的规范中有一些微妙的内容。

有几种解决方案。

SELECT  ID, 
    CASE WHEN col_a = 0 THEN CAST(0 AS DOUBLE)
    ELSE (col_b / col_a) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

SELECT  ID, 
    CASE WHEN col_a = 0 THEN 0.0
    ELSE (col_b / col_a) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

是等价的,但我想你可能想要

SELECT  ID, 
    CASE WHEN col_a = 0 THEN 0
    ELSE CAST((col_b / col_a) AS INT) END AS math_is_fun
FROM    (/* derived query*/) AS x ;

假设col_acol_b都是ints,并且您希望结果为整数除法,如wiki中所指定的那样。希望其他人会出现并建议你假设的“更好的方法”。

如果col_acol_b为双倍,或者您希望结果为浮点除法,请忽略我说的其他所有内容,只需将0更改为0.0即可它不再像Hive int那样。