Hive 配置单元CASE语句中的数据类型转换错误
我有一个HiveQL查询,看起来像:Hive 配置单元CASE语句中的数据类型转换错误,hive,hiveql,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中执行此操作时,我最近开始收到错误失败:语义分析中的错误:行X:Y ArgumentTypeMismatch'col_a':ELSE之后的表达式应该与之后的表达式具有相同的类型:“i
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中执行此操作时,我最近开始收到错误失败:语义分析中的错误:行X:Y ArgumentTypeMismatch'col_a':ELSE之后的表达式应该与之后的表达式具有相同的类型:“int”是预期的,但找到了“double”。
虽然我知道文本0
和(col\u a/col\u b)
的结果之间存在数据类型不匹配,但我不清楚Hive为什么会遇到这种情况,更重要的是,解决此错误的最佳方法是什么。我应该将文本0
转换为double
还是有更好的方法
这是在Amazon EMR中运行的Hive 0.8.1。假设列a和列b都是
整数,这是一些奇怪的行为。文本0
当然是一个int
,根据除法“给出B与A的除法结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。如果操作数是整数类型,则结果是除法的商”所以它也应该是一个int
我正在运行Hive 0.10.0,并且得到与您相同的错误,(col_b/col_a)
看起来像是一个双精度的
,但应该是一个int
。对我来说,这看起来像个bug,但可能在规范中有一些微妙的地方我没有发现
有两种解决方案
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
ELSE CAST((col_b / col_a) AS INT) END AS math_is_fun
FROM (/* derived query*/) AS x ;
假设colu_a
和col_b
都是ints
,并且您希望结果是整数除法,如wiki中指定的那样。希望其他人会来建议你假设的“更好的方法”
如果col\u a
或col\u b
是双精度的,或者您希望结果是浮点除法,忽略我说的所有其他内容,只需将0
更改为0.0
,这样它在Hive中就不再像int
。假设col a和col\u b都是int,这是一种奇怪的行为。文本0
当然是一个int
,根据除法“给出B与A的除法结果。结果的类型与操作数类型的公共父级(在类型层次结构中)相同。如果操作数是整数类型,则结果是除法的商”所以它也应该是一个int
我正在运行Hive 0.10.0,并且得到与您相同的错误,(col_b/col_a)
看起来像是一个双精度的
,但应该是一个int
。对我来说,这看起来像个bug,但可能在规范中有一些微妙的地方我没有发现
有两种解决方案
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
ELSE CAST((col_b / col_a) AS INT) END AS math_is_fun
FROM (/* derived query*/) AS x ;
假设colu_a
和col_b
都是ints
,并且您希望结果是整数除法,如wiki中指定的那样。希望其他人会来建议你假设的“更好的方法”
如果colu\u a
或col\u b
是双精度的,或者您希望结果是浮点除法,请忽略我所说的所有其他内容,只需将0
更改为0.0
,这样它对于蜂窝来说就不再像int
。使用0.0修复了它。我不明白为什么会发生这种情况,但这解决了它。使用0.0解决了它。我不明白为什么会发生这种事,但这解决了它。