Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 配置单元CASE语句中的数据类型转换错误_Hive_Hiveql - Fatal编程技术网

Hive 配置单元CASE语句中的数据类型转换错误

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

我有一个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之后的表达式应该与之后的表达式具有相同的类型:“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解决了它。我不明白为什么会发生这种事,但这解决了它。