2013-03-18 2 views
1

내가 좋아하는 뭔가를 보이는 HiveQL 쿼리가 리터럴 0과 결과가 (col_a/col_b) 인 데이터 유형이 일치하지 않는데 왜 Hive가이 문제에 대해 질식하고 있는지, 그리고 무엇보다 가장 중요한 조치는이 오류를 해결하는 것이 무엇인지에 대해 명확하지 않습니다. 문자 0double으로 캐스팅해야합니까? 아니면 더 나은 방법이 있습니까?데이터 유형 변환 오류

이것은 Amazon EMR에서 실행되는 하이브 0.8.1입니다.

답변

7

col_a와 col_b가 모두 ints 인 것으로 가정하면 이상한 행동입니다. 0int이고, wiki tutorial 나누기에 따라 "결과는 A에서 B를 나눈 결과를 제공합니다. 피연산자 유형의 공통 상위 (유형 계층 구조에서)와 동일합니다. 피연산자가 정수 유형이면 결과는 나눗셈의 지수가됩니다. 따라서 int이어야합니다.

나는 하이브 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_acol_b 가정 할 생각은 모두 ints하고 지정된대로, 결과는 정수 나누기되고 싶어 위키에서. 다른 누군가가 와서 가상의 "더 나은 접근법"을 제안 해 주길 바랍니다. col_a 또는 col_b 중 하나를 두 번, 또는 당신은 결과가 소수점 나누기를 떠하려는

경우, 내가 말한 모든 다른 무시하고 그냥 int이 하이브 같은 더 이상 보이는 00.0에 변경할 수 없습니다.

+0

0.0을 사용하여 고정 시켰습니다. 나는 왜 이것이 일어 났는지 이해하지 못한다. –