2013-04-22 73 views
0

可以這樣做嗎?這是一個測試UDF我曾試圖寫:使用jRuby編寫Hive UDF

java_package "com.foo.hive.udf" 
java_import org.apache.hadoop.hive.ql.exec.Description 
java_import org.apache.hadoop.hive.ql.exec.UDF 

java_annotation 'Description(name = "foo", value = "_FUNC_(string) - just returns test.")' 
class Foo < UDF 
    def evaluate ts 
    "test" 
    end 
end 

然後我編譯這樣的:

jrubyc com/foo/hive/udf/Foo.rb 
jar -cf Foo.jar com/foo/hive/udf/*.class /path/to/jruby-1.7.3/lib/jruby.jar 

然後我嘗試使用它:

hive> ADD JAR path/to/Foo.jar; 
Added /path/to/Foo.jar to class path 
hive> CREATE TEMPORARY FUNCTION foo AS 'com.foo.hive.udf.Foo'; 

這一點讓我:

java.lang.NoClassDefFoundError: org/jruby/ast/executable/AbstractScript 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) 
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212) 
    ... 
FAILED: Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.FunctionTask 
hive> ADD JAR /path/to/Foo.jar; 

同樣的事情,用java編寫, 工作正常。所以這對我來說似乎是一個jRuby問題?

回答

0

java.lang.NoClassDefFoundError: org/jruby/ast/executable/AbstractScript告訴你JRuby運行時jar不可用。當您編譯JRuby類時,它會創建一個.class文件,該文件取決於您編譯的JRuby版本。

我猜,如果你下載了完整的JRuby罐子,你可以運行

> ADD JAR jruby-complete-1.7.4.jar 

,然後你的類必須配置它的依賴。