1

我有一个 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为 adouble还是有更好的方法?

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

4

1 回答 1

7

假设 col_a 和 col_b 都是ints. 字面0量当然是 an int,并且根据wiki 教程划分“给出将 B 与 A 相除的结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。如果操作数是整数类型,那么结果是除法的商”,所以它也应该是一个int

我正在运行 Hive 0.10.0 并遇到与您相同的错误,(col_b / col_a)看起来像 adouble但应该是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_aorcol_b是双倍的,或者您希望结果是浮点除法,请忽略我所说的所有其他内容,只需更改00.0,使其不再看起来像intHive。

于 2013-03-18T21:37:27.243 回答