2013-03-18 4 views
1

У меня есть запрос HiveQL, который выглядит примерно так:Datatype в заявлении СЛУЧАЯ улого

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

Когда я выполняю это в улье, я недавно начал получать ошибку 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 или есть лучший подход?

Это Hive 0.8.1 работает в Amazon EMR.

ответ

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, и вы хотите, чтобы результат целочисленного деления, как указано в вики. Надеюсь, кто-то еще придет и предложит ваш гипотетический «лучший подход».

Если какая-либо col_a или col_b двойные, или вы хотите, чтобы результат с плавающей точкой разделения, игнорировать все остальное я сказал и просто изменить 0 к 0.0 так больше не выглядит как int в улей.

+0

Использование 0.0 исправлено. Я не понимаю, почему это произошло, но это исправило это. –

 Смежные вопросы

  • Нет связанных вопросов^_^