我的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。
答案 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_a
和col_b
都是ints
,并且您希望结果为整数除法,如wiki中所指定的那样。希望其他人会出现并建议你假设的“更好的方法”。
如果col_a
或col_b
为双倍,或者您希望结果为浮点除法,请忽略我说的其他所有内容,只需将0
更改为0.0
即可它不再像Hive int
那样。