2017-11-06 2 views
0

E. Capriolo 등의 Programming Hive의 168 페이지에 "... Java 원시 요소는 객체가 아니므로 null이 될 수 없습니다."라는 내용이 있습니다. 그래서, 간단한 하이브 UDF의 경우 :하이브 UDF, Java Primitives 및 null

public class ConvertToCelcius extends UDF { 
    public double evaluate(double value) { 
     return (value - 32)/1.8; 
     } 
} 

null 행 값을 만나면 어떻게됩니까?

또한 Java 프리미티브를 사용하여 null이 UDF로 전달되는지 여부를 테스트 할 수 있습니까?

아마도, 우리는 다시 쓸 수 있기 때문에 위 :

public class ConvertToCelcius extends UDF { 
    public Double evaluate(Double value) { 
     if (value == null) { 
      return null; 
     } 
     return (value - 32)/1.8; 
     } 
} 
+1

"null 행 값을 만나면 어떻게됩니까? *"=> 컴파일 오류 - 그렇게 할 수 없습니다. 'Double'을 패스하지 않으면 NPE를 얻을 수 있습니다. – assylias

+0

컴파일 오류 또는 런타임 오류? 위의 "double"코드는 정상적으로 컴파일됩니다. – user25029

+0

제 말은 첫 번째 메소드에서'evaluate (null)'을 호출 할 수 없다는 것입니다 : 컴파일 오류. 런타임에'Double d = null'을 전달하면 NullPointerException이 발생합니다. – assylias

답변

1

우리는 데이터 만 입력 프리미티브와 UDF를 작성하고 SQL 케이스 문

select 
     CASE WHEN columnName = null then null 
       else evaluate(columnName) end columnName 
From tabelName 

참고 null 값을 확인할 수 있습니다 : evaluate UDF 이름입니다.

+0

"... 우리는 프리미티브 데이터 형식으로 만 UDF를 만들 수 있습니다 ..."나는 이것이 정확하다고 생각하지 않습니다. 나는 두 배의 명부를 가진 몇몇 UDFs가있다 (예를 들면 목록 ) 그들은 잘 작동한다. 그러나, 자바 원시에 null을 전달하지 않도록 질의 측면에서 null을 테스트해야한다는 것에 대한 당신의 요지를 본다. – user25029

+0

@ user25029 이것은 (예 :리스트 ) 것은 자바 권투와 unboxing 기능으로 인해 더 workin입니다. –

+0

동의하지만 목록은 이 기본이 아닙니다. – user25029